/*++

Copyright (c) 2016 Minoca Corp.

    This file is licensed under the terms of the GNU General Public License
    version 3. Alternative licensing terms are available. Contact
    info@minocacorp.com for details. See the LICENSE file at the root of this
    project for complete licensing information.

Module Name:

    soko.c

Abstract:

    This module implements a utility to tightly and efficiently pack data.

Author:

    Evan Green 22-Sep-2016

Environment:

    POSIX

--*/

//
// ------------------------------------------------------------------- Includes
//

#include <minoca/lib/types.h>

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "swlib.h"

//
// ---------------------------------------------------------------- Definitions
//

//
// Define the maximum width of a level map.
//

#define SOKO_MAX_WIDTH 31

//
// Define the offset on the screen where the map begins.
//

#define SOKO_MAP_Y_OFFSET 1

//
// Define the level map encoding bits.
//

#define SOKO_MAP_COUNT_MASK 0x1F
#define SOKO_MAP_TYPE_MASK (0x7 << 5)
#define SOKO_MAP_TYPE_SHIFT 5
#define SOKO_MAP_SPACE 0x0
#define SOKO_MAP_BOX 0x1
#define SOKO_MAP_HOME 0x2
#define SOKO_MAP_BOX_HOME 0x3
#define SOKO_MAP_WALL 0x4
#define SOKO_MAP_WALL_NEWLINE 0x5
#define SOKO_MAP_PLAYER 0x6

//
// The level separator is a space with a run length of zero.
//

#define SOKO_MAP_LEVEL 0

//
// Define generated values.
//

#define SOKO_ENCODED_MAP_SIZE 9645
#define SOKO_LEVEL_COUNT 90
#define SOKO_MAX_HEIGHT 17

//
// Define some input characters.
//

#define SOKO_UP 'e'
#define SOKO_DOWN 'd'
#define SOKO_LEFT 's'
#define SOKO_RIGHT 'f'
#define SOKO_UNDO 'u'
#define SOKO_RESTART 'r'
#define SOKO_QUIT 'q'
#define SOKO_CONTINUE ' '
#define SOKO_LEVEL_UP '+'
#define SOKO_LEVEL_DOWN '-'

//
// ------------------------------------------------------ Data Type Definitions
//

/*++

Structure Description:

    This structure stores the context for the soko application.

Members:

    Level - Stores the zero-based level the player is on.

    RemainingBoxes - Stores the number of boxes remaining.

    Moves - Stores the number of moves the player used.

    StartTime - Stores the time when the player started.

    Map - Stores the current level map.

    PlayerX - Stores the X coordinate of the player's position.

    PlayerY - Stores the Y coordinate of the player's position.

    LastMove - Stores the player's last move.

--*/

typedef struct _SOKO_CONTEXT {
    INT Level;
    INT RemainingBoxes;
    INT Moves;
    time_t StartTime;
    UCHAR Map[SOKO_MAX_HEIGHT][SOKO_MAX_WIDTH];
    INT PlayerX;
    INT PlayerY;
    CHAR LastMove;
} SOKO_CONTEXT, *PSOKO_CONTEXT;

//
// ----------------------------------------------- Internal Function Prototypes
//

INT
SokoGetInput (
    PSOKO_CONTEXT Context
    );

VOID
SokoMove (
    PSOKO_CONTEXT Context,
    INT Move
    );

VOID
SokoUndo (
    PSOKO_CONTEXT Context
    );

INT
SokoEncodeMaps (
    PSOKO_CONTEXT Context,
    PSTR MapsPath
    );

VOID
SokoSetupLevel (
    PSOKO_CONTEXT Context
    );

PUCHAR
SokoFindLevelMap (
    PSOKO_CONTEXT Context
    );

//
// -------------------------------------------------------------------- Globals
//

const CHAR SokoMapTiles[8] = {
    ' ', 'X', '.', 'O', '#', '#', '*', '?'
};

PCSTR SokoLegend[] = {
    "QQuit",
    "UUndo",
    "RRestart",
    "+Level Up",
    "-Level Down",
    NULL
};

const CONSOLE_COLOR SokoMapForegroundColors[8] = {
    ConsoleColorBlack,
    ConsoleColorRed,
    ConsoleColorGreen,
    ConsoleColorGreen,
    ConsoleColorGray,
    ConsoleColorGray,
    ConsoleColorCyan,
    ConsoleColorDefault,
};

const CONSOLE_COLOR SokoMapBackgroundColors[8] = {
    ConsoleColorBlack,
    ConsoleColorDarkRed,
    ConsoleColorDarkGreen,
    ConsoleColorDarkGreen,
    ConsoleColorGray,
    ConsoleColorGray,
    ConsoleColorBlack,
    ConsoleColorDefault
};

//
// This map data was automatically generated by this program from a more
// friendly map format.
//

const UCHAR SokoMaps[] = {
    0x04, 0xA5, 0x04, 0x81, 0x03, 0xA1, 0x04, 0x81, 0x21, 0x02,
    0xA1, 0x02, 0x83, 0x02, 0x21, 0xA2, 0x02, 0x81, 0x02, 0x21,
    0x01, 0x21, 0x01, 0xA1, 0x83, 0x01, 0x81, 0x01, 0x82, 0x01,
    0x81, 0x03, 0xA6, 0x81, 0x03, 0x81, 0x01, 0x82, 0x01, 0x85,
    0x02, 0x42, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x21, 0x0A, 0x42,
    0xA1, 0x85, 0x01, 0x83, 0x01, 0x81, 0xC1, 0x82, 0x02, 0x42,
    0xA1, 0x04, 0x81, 0x05, 0xA9, 0x04, 0xA7, 0x00,
    0xAC, 0x81, 0x42, 0x02, 0x81, 0x05, 0xA3, 0x81, 0x42, 0x02,
    0x81, 0x01, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x42, 0x02,
    0x81, 0x21, 0x84, 0x02, 0xA1, 0x81, 0x42, 0x04, 0xC1, 0x01,
    0x82, 0x02, 0xA1, 0x81, 0x42, 0x02, 0x81, 0x01, 0x81, 0x02,
    0x21, 0x01, 0xA2, 0x86, 0x01, 0x82, 0x21, 0x01, 0x21, 0x01,
    0xA1, 0x02, 0x81, 0x01, 0x21, 0x02, 0x21, 0x01, 0x21, 0x01,
    0x21, 0x01, 0xA1, 0x02, 0x81, 0x04, 0x81, 0x05, 0xA1, 0x02,
    0xAC, 0x00,
    0x08, 0xA8, 0x08, 0x81, 0x05, 0xC1, 0xA1, 0x08, 0x81, 0x01,
    0x21, 0x81, 0x21, 0x01, 0xA2, 0x08, 0x81, 0x01, 0x21, 0x02,
    0x21, 0xA1, 0x08, 0x82, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x89,
    0x01, 0x21, 0x01, 0x81, 0x01, 0xA3, 0x81, 0x44, 0x02, 0x82,
    0x01, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x82, 0x43, 0x04, 0x21,
    0x02, 0x21, 0x03, 0xA1, 0x81, 0x44, 0x02, 0xAA, 0xA8, 0x00,
    0x0B, 0xA8, 0x0B, 0x81, 0x02, 0x44, 0xA1, 0x8C, 0x02, 0x44,
    0xA1, 0x81, 0x04, 0x81, 0x02, 0x21, 0x01, 0x21, 0x03, 0x44,
    0xA1, 0x81, 0x01, 0x23, 0x81, 0x21, 0x02, 0x21, 0x01, 0x81,
    0x02, 0x44, 0xA1, 0x81, 0x02, 0x21, 0x05, 0x21, 0x01, 0x81,
    0x02, 0x44, 0xA1, 0x81, 0x01, 0x22, 0x01, 0x81, 0x21, 0x01,
    0x21, 0x01, 0x21, 0xA8, 0x81, 0x02, 0x21, 0x01, 0x81, 0x05,
    0xA1, 0x82, 0x01, 0xA9, 0x81, 0x04, 0x81, 0x04, 0xA2, 0x81,
    0x05, 0x21, 0x03, 0xA2, 0x81, 0x02, 0x22, 0x81, 0x22, 0x02,
    0xC1, 0xA1, 0x81, 0x04, 0x81, 0x04, 0xA2, 0xAB, 0x00,
    0x08, 0xA5, 0x08, 0x81, 0x03, 0xA5, 0x08, 0x81, 0x01, 0x81,
    0x21, 0x82, 0x02, 0xA1, 0x08, 0x81, 0x05, 0x21, 0x01, 0xA1,
    0x89, 0x01, 0x83, 0x03, 0xA1, 0x81, 0x44, 0x02, 0x82, 0x01,
    0x21, 0x02, 0x21, 0xA3, 0x81, 0x44, 0x04, 0x21, 0x01, 0x22,
    0x01, 0xA2, 0x81, 0x44, 0x02, 0x82, 0x21, 0x02, 0x21, 0x01,
    0xC1, 0xA1, 0x89, 0x02, 0x21, 0x02, 0xA2, 0x08, 0x81, 0x01,
    0x21, 0x01, 0x21, 0x02, 0xA1, 0x08, 0x83, 0x01, 0x82, 0x01,
    0xA1, 0x0A, 0x81, 0x04, 0xA1, 0x0A, 0xA6, 0x00,
    0x86, 0x02, 0xA3, 0x81, 0x42, 0x02, 0x81, 0x01, 0x82, 0xC1,
    0xA2, 0x81, 0x42, 0x02, 0x83, 0x03, 0xA1, 0x81, 0x42, 0x05,
    0x22, 0x01, 0xA1, 0x81, 0x42, 0x02, 0x81, 0x01, 0x81, 0x01,
    0x21, 0x01, 0xA1, 0x81, 0x42, 0x83, 0x01, 0x81, 0x01, 0x21,
    0x01, 0xA1, 0x84, 0x01, 0x21, 0x01, 0x81, 0x21, 0x02, 0xA1,
    0x03, 0x81, 0x02, 0x21, 0x81, 0x01, 0x21, 0x01, 0xA1, 0x03,
    0x81, 0x01, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x03, 0x81, 0x02,
    0x82, 0x03, 0xA1, 0x03, 0xA9, 0x00,
    0x07, 0xA5, 0x01, 0x87, 0x03, 0xA2, 0x82, 0x01, 0x81, 0x01,
    0xC1, 0x82, 0x01, 0x22, 0x01, 0xA1, 0x81, 0x04, 0x21, 0x06,
    0xA1, 0x81, 0x02, 0x21, 0x02, 0x83, 0x03, 0xA1, 0x83, 0x01,
    0x85, 0x21, 0xA3, 0x81, 0x01, 0x21, 0x02, 0x83, 0x01, 0x42,
    0xA1, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x43,
    0xA1, 0x81, 0x04, 0x83, 0x43, 0xA1, 0x81, 0x01, 0x22, 0x01,
    0x81, 0x01, 0x81, 0x43, 0xA1, 0x81, 0x02, 0x83, 0x01, 0xA5,
    0xA4, 0x00,
    0x02, 0xA4, 0x02, 0x81, 0x02, 0xAB, 0x02, 0x81, 0x04, 0x21,
    0x03, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x02, 0x81, 0x01, 0x21,
    0x81, 0x01, 0x21, 0x01, 0x81, 0x02, 0x21, 0x02, 0xA1, 0x02,
    0x81, 0x02, 0x21, 0x01, 0x21, 0x02, 0x81, 0x04, 0xA1, 0x83,
    0x01, 0x21, 0x81, 0x01, 0x81, 0x02, 0x84, 0x01, 0xA1, 0x81,
    0xC1, 0x81, 0x21, 0x01, 0x21, 0x01, 0x21, 0x02, 0x82, 0x03,
    0xA1, 0x81, 0x04, 0x21, 0x01, 0x81, 0x21, 0x81, 0x03, 0x81,
    0x01, 0xA1, 0x81, 0x03, 0x21, 0x04, 0x21, 0x01, 0x21, 0x01,
    0x21, 0x01, 0xA1, 0x85, 0x02, 0xA9, 0x02, 0x81, 0x06, 0xA1,
    0x02, 0x81, 0x06, 0xA1, 0x02, 0x81, 0x46, 0xA1, 0x02, 0x81,
    0x46, 0xA1, 0x02, 0x81, 0x46, 0xA1, 0x02, 0xA8, 0x00,
    0x0A, 0xA7, 0x0A, 0x81, 0x02, 0x43, 0xA1, 0x06, 0x85, 0x02,
    0x43, 0xA1, 0x06, 0x81, 0x06, 0x41, 0x01, 0x41, 0xA1, 0x06,
    0x81, 0x02, 0x82, 0x02, 0x43, 0xA1, 0x06, 0x82, 0x01, 0x82,
    0x02, 0x43, 0xA1, 0x05, 0x83, 0x01, 0xA8, 0x05, 0x81, 0x01,
    0x23, 0x01, 0xA2, 0x01, 0x85, 0x02, 0x21, 0x01, 0x21, 0x01,
    0xA5, 0x82, 0x03, 0x81, 0x21, 0x01, 0x21, 0x03, 0x81, 0x03,
    0xA1, 0x81, 0xC1, 0x01, 0x21, 0x02, 0x21, 0x04, 0x21, 0x02,
    0x21, 0x01, 0xA1, 0x86, 0x01, 0x22, 0x01, 0x21, 0x01, 0xA5,
    0x05, 0x81, 0x06, 0xA1, 0x05, 0xA8, 0x00,
    0x01, 0x83, 0x02, 0xAD, 0x82, 0xC1, 0x84, 0x07, 0x81, 0x03,
    0xA1, 0x81, 0x01, 0x22, 0x03, 0x22, 0x02, 0x21, 0x01, 0x21,
    0x01, 0x43, 0xA1, 0x81, 0x02, 0x23, 0x81, 0x04, 0x21, 0x02,
    0x81, 0x43, 0xA1, 0x81, 0x01, 0x21, 0x03, 0x81, 0x01, 0x22,
    0x01, 0x22, 0x01, 0x81, 0x43, 0xA1, 0x83, 0x03, 0x81, 0x02,
    0x21, 0x04, 0x81, 0x43, 0xA1, 0x81, 0x05, 0x81, 0x01, 0x21,
    0x01, 0x21, 0x01, 0x21, 0x01, 0x81, 0x43, 0xA1, 0x81, 0x04,
    0x86, 0x01, 0x83, 0x43, 0xA1, 0x82, 0x01, 0x81, 0x02, 0x81,
    0x02, 0x21, 0x01, 0x21, 0x02, 0x81, 0x43, 0xA1, 0x81, 0x02,
    0x82, 0x01, 0x81, 0x01, 0x22, 0x01, 0x21, 0x01, 0x21, 0x82,
    0x42, 0xA1, 0x81, 0x01, 0x42, 0x81, 0x01, 0x81, 0x02, 0x21,
    0x06, 0x81, 0x41, 0xA1, 0x81, 0x01, 0x42, 0x81, 0x01, 0x81,
    0x01, 0x23, 0x01, 0x23, 0x01, 0x81, 0x41, 0xA1, 0x85, 0x01,
    0x81, 0x07, 0x81, 0x01, 0x81, 0x41, 0xA1, 0x04, 0x81, 0x01,
    0x89, 0x01, 0x81, 0x41, 0xA1, 0x04, 0x81, 0x0B, 0x81, 0x41,
    0xA1, 0x04, 0xAF, 0x00,
    0x0A, 0xA4, 0x05, 0x84, 0x01, 0x81, 0x02, 0xA1, 0x03, 0x83,
    0x01, 0xC1, 0x83, 0x21, 0x01, 0xA1, 0x02, 0x82, 0x06, 0x21,
    0x02, 0xA1, 0x01, 0x82, 0x02, 0x21, 0x01, 0x22, 0x82, 0x01,
    0xA2, 0x01, 0x81, 0x02, 0x81, 0x21, 0x82, 0x05, 0xA1, 0x01,
    0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x22, 0x01, 0x81, 0x01,
    0xA3, 0x01, 0x81, 0x03, 0x21, 0x01, 0x81, 0x02, 0x81, 0x01,
    0x21, 0x01, 0xA5, 0x84, 0x04, 0x81, 0x02, 0x22, 0x01, 0x81,
    0x03, 0xA1, 0x84, 0x01, 0x82, 0x01, 0x21, 0x09, 0xA1, 0x81,
    0x41, 0x04, 0x83, 0x02, 0xA8, 0x81, 0x42, 0x01, 0x42, 0x81,
    0x01, 0xA4, 0x81, 0x43, 0x81, 0x41, 0xA1, 0x81, 0x45, 0xA1,
    0xA7, 0x00,
    0xB0, 0x81, 0x0E, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x86, 0x05,
    0xA1, 0x81, 0x01, 0x81, 0x02, 0x21, 0x01, 0x21, 0x01, 0x21,
    0x01, 0x21, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x81, 0x03, 0x21,
    0xC1, 0x21, 0x03, 0x82, 0x01, 0xA2, 0x81, 0x01, 0x81, 0x02,
    0x21, 0x01, 0x21, 0x01, 0x21, 0x83, 0x43, 0xA1, 0x81, 0x01,
    0x81, 0x03, 0x21, 0x01, 0x21, 0x02, 0x82, 0x43, 0xA1, 0x81,
    0x01, 0x83, 0x23, 0x01, 0x21, 0x01, 0x82, 0x43, 0xA1, 0x81,
    0x05, 0x81, 0x01, 0x82, 0x01, 0x82, 0x43, 0xA1, 0x85, 0x03,
    0x82, 0x01, 0x82, 0x43, 0xA1, 0x04, 0x85, 0x05, 0xA3, 0x08,
    0x81, 0x05, 0xA1, 0x08, 0xA7, 0x00,
    0x03, 0xA9, 0x02, 0x82, 0x03, 0x82, 0x02, 0xA6, 0x83, 0x05,
    0x81, 0x02, 0x81, 0x04, 0xA3, 0x81, 0x02, 0x21, 0x01, 0x81,
    0x21, 0x01, 0x81, 0x02, 0x81, 0x02, 0x43, 0x01, 0xA1, 0x81,
    0x01, 0x81, 0x01, 0x21, 0x81, 0xC1, 0x21, 0x82, 0x01, 0x81,
    0x01, 0x81, 0x41, 0x81, 0x41, 0x01, 0xA1, 0x81, 0x02, 0x81,
    0x01, 0x81, 0x21, 0x02, 0x81, 0x04, 0x41, 0x01, 0x41, 0x01,
    0xA1, 0x81, 0x01, 0x21, 0x04, 0x21, 0x01, 0x81, 0x01, 0x81,
    0x01, 0x81, 0x41, 0x81, 0x41, 0x01, 0xA1, 0x81, 0x03, 0x82,
    0x02, 0x82, 0x21, 0x01, 0x21, 0x01, 0x41, 0x01, 0x41, 0x01,
    0xA1, 0x81, 0x01, 0x21, 0x01, 0x81, 0x03, 0x81, 0x02, 0x81,
    0x21, 0x81, 0x41, 0x81, 0x41, 0x01, 0xA1, 0x82, 0x01, 0x21,
    0x02, 0x21, 0x03, 0x21, 0x02, 0x21, 0x43, 0x01, 0xA1, 0x01,
    0x81, 0x21, 0x01, 0x86, 0x04, 0x82, 0x02, 0xA1, 0x01, 0x81,
    0x02, 0x81, 0x04, 0xAA, 0x01, 0xA4, 0x00,
    0x07, 0xA7, 0x01, 0x87, 0x05, 0xA1, 0x01, 0x81, 0x05, 0x81,
    0x01, 0x21, 0xC1, 0x21, 0x01, 0xA1, 0x01, 0x81, 0x22, 0x01,
    0x81, 0x03, 0xA9, 0x01, 0x81, 0x01, 0x83, 0x46, 0x82, 0x03,
    0xA1, 0x01, 0x81, 0x03, 0x21, 0x46, 0x82, 0x01, 0x81, 0x01,
    0xA1, 0x01, 0x81, 0x01, 0x83, 0x46, 0x05, 0xA1, 0x82, 0x03,
    0x84, 0x01, 0x83, 0x01, 0x81, 0x21, 0xA2, 0x81, 0x02, 0x81,
    0x21, 0x03, 0x81, 0x02, 0x21, 0x02, 0x81, 0x01, 0xA1, 0x81,
    0x02, 0x21, 0x01, 0x23, 0x02, 0x81, 0x01, 0x21, 0x82, 0x01,
    0xA1, 0x81, 0x03, 0x21, 0x01, 0x21, 0x01, 0x83, 0x22, 0x01,
    0x81, 0x01, 0xA1, 0x85, 0x05, 0x21, 0x03, 0x81, 0x01, 0xA1,
    0x04, 0x83, 0x01, 0x83, 0x03, 0x81, 0x01, 0xA1, 0x06, 0x81,
    0x05, 0x81, 0x03, 0xA1, 0x06, 0x88, 0x02, 0xA1, 0x0D, 0xA4,
    0x00,
    0x03, 0xA8, 0x03, 0x81, 0x03, 0x81, 0x02, 0xA1, 0x03, 0x81,
    0x02, 0x21, 0x03, 0xA1, 0x01, 0x83, 0x01, 0x81, 0x21, 0x03,
    0xA4, 0x01, 0x81, 0x02, 0x21, 0x02, 0x82, 0x21, 0x03, 0xA1,
    0x01, 0x81, 0x02, 0x81, 0x01, 0xC1, 0x01, 0x21, 0x01, 0x81,
    0x01, 0x21, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x06, 0x21, 0x01,
    0xA4, 0x01, 0x82, 0x01, 0x84, 0x21, 0x82, 0x05, 0xA1, 0x01,
    0x81, 0x01, 0x21, 0x81, 0x45, 0x81, 0x01, 0x81, 0x03, 0xA1,
    0x01, 0x81, 0x02, 0x21, 0x42, 0x62, 0x41, 0x01, 0x21, 0x81,
    0x01, 0xA3, 0x82, 0x02, 0x81, 0x45, 0x81, 0x03, 0xA1, 0x81,
    0x03, 0x83, 0x01, 0xA7, 0x81, 0x01, 0x22, 0x02, 0x81, 0x02,
    0xA1, 0x81, 0x02, 0x81, 0x05, 0xA1, 0x86, 0x03, 0xA1, 0x05,
    0xA5, 0x00,
    0xA5, 0x81, 0x03, 0xA2, 0x81, 0x04, 0x81, 0x02, 0xA4, 0x81,
    0x01, 0x21, 0x02, 0x84, 0x02, 0xA1, 0x81, 0x02, 0x22, 0x01,
    0x21, 0x03, 0x21, 0xA1, 0x83, 0xC1, 0x01, 0x81, 0x21, 0x04,
    0xA2, 0x01, 0x81, 0x02, 0x82, 0x02, 0x21, 0x01, 0x21, 0x01,
    0xA2, 0x01, 0x81, 0x01, 0x21, 0x02, 0x82, 0x01, 0x82, 0x01,
    0x41, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x21, 0x82, 0x21, 0x02,
    0x81, 0x41, 0xA1, 0x01, 0x83, 0x03, 0x21, 0x42, 0x82, 0x41,
    0xA1, 0x02, 0x81, 0x04, 0x81, 0x41, 0x61, 0x43, 0xA1, 0x02,
    0x81, 0x01, 0x22, 0x01, 0x81, 0x45, 0xA1, 0x02, 0x81, 0x02,
    0xA9, 0x02, 0x81, 0x02, 0xA1, 0x02, 0xA4, 0x00,
    0x03, 0xAA, 0x03, 0x81, 0x42, 0x02, 0x81, 0x03, 0xA1, 0x03,
    0x81, 0x42, 0x06, 0xA1, 0x03, 0x81, 0x42, 0x02, 0x81, 0x02,
    0xA4, 0x02, 0x87, 0x02, 0x81, 0x02, 0xA2, 0x02, 0x81, 0x0C,
    0xA1, 0x02, 0x81, 0x02, 0x81, 0x02, 0x82, 0x02, 0x81, 0x02,
    0xA1, 0x84, 0x01, 0x82, 0x02, 0x84, 0x01, 0xA2, 0x81, 0x02,
    0x21, 0x02, 0x85, 0x01, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x81,
    0x01, 0x21, 0x02, 0x21, 0x02, 0x81, 0x01, 0x21, 0x02, 0xA1,
    0x81, 0x01, 0xC1, 0x21, 0x02, 0x21, 0x03, 0x81, 0x03, 0xA2,
    0x84, 0x01, 0x82, 0x01, 0xA7, 0x03, 0x81, 0x04, 0xA1, 0x03,
    0xA6, 0x00,
    0x05, 0xAB, 0x05, 0x81, 0x02, 0x41, 0x02, 0x81, 0x03, 0xA1,
    0x05, 0x81, 0x01, 0x81, 0x41, 0x04, 0xC1, 0x01, 0xA1, 0x01,
    0x85, 0x01, 0x82, 0x42, 0x81, 0x01, 0xA4, 0x82, 0x02, 0x81,
    0x01, 0x42, 0x83, 0x05, 0xA3, 0x81, 0x01, 0x21, 0x01, 0x81,
    0x43, 0x03, 0x21, 0x01, 0x81, 0x02, 0x21, 0x01, 0xA1, 0x81,
    0x04, 0x42, 0x01, 0x82, 0x02, 0x82, 0x01, 0x82, 0x01, 0xA1,
    0x84, 0x21, 0x82, 0x21, 0x81, 0x01, 0x21, 0x01, 0x81, 0x03,
    0x81, 0x01, 0xA1, 0x02, 0x82, 0x01, 0x81, 0x04, 0x81, 0x21,
    0x01, 0x22, 0x01, 0x81, 0x01, 0xA1, 0x02, 0x81, 0x02, 0x21,
    0x01, 0x81, 0x01, 0x81, 0x02, 0x81, 0x01, 0x21, 0x82, 0x01,
    0xA1, 0x02, 0x81, 0x0F, 0xA1, 0x02, 0x81, 0x02, 0x8B, 0x02,
    0xA1, 0x02, 0x84, 0x09, 0xA4, 0x00,
    0x02, 0xA6, 0x02, 0x81, 0x03, 0xC1, 0xA4, 0x85, 0x01, 0x21,
    0x03, 0xA1, 0x81, 0x03, 0x82, 0x04, 0xA4, 0x81, 0x01, 0x21,
    0x01, 0x81, 0x02, 0x82, 0x04, 0xA1, 0x81, 0x01, 0x21, 0x01,
    0x81, 0x02, 0x85, 0x01, 0xA1, 0x82, 0x01, 0x21, 0x02, 0x21,
    0x04, 0x81, 0x01, 0xA1, 0x82, 0x01, 0x21, 0x01, 0x21, 0x01,
    0x83, 0x01, 0x81, 0x01, 0xA1, 0x82, 0x01, 0x81, 0x02, 0x21,
    0x02, 0x81, 0x01, 0x81, 0x01, 0xA1, 0x82, 0x01, 0x81, 0x01,
    0x81, 0x21, 0x81, 0x03, 0x81, 0x01, 0xA1, 0x82, 0x01, 0x83,
    0x03, 0x81, 0x01, 0x81, 0x01, 0xA6, 0x81, 0x02, 0x21, 0x02,
    0x84, 0x01, 0x81, 0x01, 0x81, 0x44, 0xA1, 0x81, 0x04, 0x21,
    0x04, 0x21, 0x03, 0x42, 0x81, 0x41, 0xA1, 0x84, 0x21, 0x02,
    0x21, 0x81, 0x01, 0x21, 0x03, 0x44, 0xA1, 0x81, 0x07, 0x81,
    0x02, 0x82, 0x01, 0x44, 0xA1, 0xB3, 0x00,
    0x04, 0xAA, 0x85, 0x08, 0xA4, 0x81, 0x05, 0x81, 0x03, 0x21,
    0x02, 0x81, 0xC1, 0x01, 0xA1, 0x81, 0x01, 0x87, 0x21, 0x84,
    0x02, 0xA3, 0x81, 0x01, 0x81, 0x04, 0x82, 0x01, 0x81, 0x02,
    0x81, 0x21, 0x01, 0x42, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x05, 0x81, 0x02, 0x81, 0x02, 0x81, 0x41, 0xA1, 0x81, 0x01,
    0x81, 0x01, 0x21, 0x02, 0x81, 0x05, 0x81, 0x21, 0x01, 0x42,
    0xA1, 0x81, 0x01, 0x81, 0x02, 0x83, 0x01, 0x82, 0x05, 0x81,
    0x41, 0xA1, 0x81, 0x01, 0x83, 0x02, 0x81, 0x02, 0x81, 0x02,
    0x81, 0x21, 0x01, 0x42, 0xA1, 0x81, 0x01, 0x81, 0x04, 0x81,
    0x02, 0x84, 0x02, 0x81, 0x41, 0xA1, 0x81, 0x01, 0x81, 0x21,
    0x03, 0x21, 0x02, 0x21, 0x02, 0x81, 0x21, 0x01, 0x42, 0xA1,
    0x81, 0x04, 0x21, 0x01, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01,
    0x81, 0x02, 0x81, 0x41, 0xA1, 0x84, 0x01, 0x21, 0x83, 0x04,
    0x81, 0x21, 0x01, 0x42, 0xA1, 0x03, 0x81, 0x04, 0x22, 0x01,
    0x83, 0x44, 0xA1, 0x03, 0x81, 0x06, 0x82, 0x01, 0xA6, 0x03,
    0xA8, 0x00,
    0xA9, 0x81, 0x07, 0xA1, 0x81, 0x07, 0xA4, 0x82, 0x01, 0x84,
    0x01, 0x81, 0x02, 0xA1, 0x82, 0x01, 0x81, 0xC1, 0x82, 0x04,
    0xA1, 0x81, 0x01, 0x23, 0x01, 0x21, 0x02, 0x22, 0xA1, 0x81,
    0x02, 0x81, 0x01, 0x82, 0x01, 0x21, 0x02, 0xA1, 0x81, 0x02,
    0x81, 0x01, 0x82, 0x02, 0x21, 0x01, 0xA4, 0x84, 0x02, 0x23,
    0x01, 0x21, 0x81, 0x02, 0xA1, 0x01, 0x81, 0x03, 0x82, 0x03,
    0x44, 0xA1, 0x01, 0x81, 0x01, 0x81, 0x03, 0x81, 0x01, 0x81,
    0x42, 0x01, 0x41, 0xA1, 0x01, 0x81, 0x03, 0x81, 0x01, 0x81,
    0x01, 0x82, 0x43, 0xA1, 0x01, 0x85, 0x01, 0x21, 0x02, 0x81,
    0x43, 0xA1, 0x05, 0x82, 0x03, 0xA5, 0x06, 0xA5, 0x00,
    0x86, 0x05, 0xA4, 0x81, 0x04, 0x87, 0x02, 0xA5, 0x81, 0x03,
    0x21, 0x81, 0x02, 0x81, 0x02, 0x21, 0x02, 0x81, 0x03, 0xA1,
    0x81, 0x02, 0x21, 0x02, 0x21, 0x02, 0x21, 0x01, 0x81, 0x01,
    0x21, 0x01, 0x21, 0x02, 0xA1, 0x82, 0x21, 0x01, 0x21, 0x03,
    0x81, 0x01, 0xC1, 0x81, 0x01, 0x21, 0x04, 0xA1, 0x81, 0x02,
    0x21, 0x01, 0x8B, 0x01, 0xA2, 0x81, 0x01, 0x81, 0x03, 0x81,
    0x47, 0x81, 0x01, 0x21, 0xA1, 0x81, 0x01, 0x82, 0x02, 0x81,
    0x01, 0x46, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x81, 0x03, 0x21,
    0x48, 0x21, 0x01, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x21, 0x01,
    0x81, 0x44, 0x01, 0x42, 0x81, 0x02, 0xA1, 0x81, 0x02, 0x21,
    0x01, 0x21, 0x84, 0x21, 0x84, 0x01, 0x21, 0xA1, 0x81, 0x01,
    0x21, 0x03, 0x83, 0x01, 0x21, 0x03, 0x21, 0x02, 0xA2, 0x81,
    0x01, 0x21, 0x05, 0x21, 0x01, 0x21, 0x02, 0x21, 0x04, 0xA1,
    0x82, 0x01, 0x86, 0x01, 0x21, 0x01, 0x85, 0x01, 0xA1, 0x81,
    0x09, 0x81, 0x07, 0xA1, 0xB3, 0x00,
    0x04, 0xA7, 0x04, 0x81, 0x02, 0x81, 0x02, 0xA4, 0x85, 0x01,
    0x21, 0x81, 0x21, 0x01, 0x81, 0x02, 0xA2, 0x81, 0x42, 0x01,
    0x81, 0x02, 0x81, 0x02, 0x81, 0x03, 0xA1, 0x81, 0x42, 0x01,
    0x81, 0x01, 0x21, 0x81, 0x21, 0x01, 0x81, 0x02, 0x21, 0xA4,
    0x81, 0x41, 0x02, 0x81, 0x05, 0x81, 0x21, 0x02, 0x81, 0x02,
    0xA1, 0x81, 0x42, 0x03, 0x21, 0x81, 0x02, 0x81, 0x01, 0x21,
    0x04, 0xA1, 0x81, 0x42, 0xC1, 0x81, 0x02, 0x81, 0x21, 0x01,
    0x81, 0x21, 0x02, 0x81, 0x02, 0xA1, 0x81, 0x42, 0x01, 0x81,
    0x01, 0x21, 0x81, 0x05, 0x21, 0x81, 0x02, 0xA1, 0x81, 0x42,
    0x01, 0x81, 0x02, 0x81, 0x22, 0x81, 0x21, 0x02, 0x81, 0x02,
    0xA2, 0x81, 0x42, 0x01, 0x81, 0x01, 0x21, 0x81, 0x02, 0x81,
    0x02, 0x21, 0x81, 0x21, 0x02, 0xA1, 0x81, 0x42, 0x01, 0x81,
    0x02, 0x81, 0x02, 0x81, 0x03, 0x81, 0x03, 0xA1, 0x82, 0x41,
    0x01, 0x84, 0x02, 0x85, 0x03, 0xA1, 0x01, 0x84, 0x02, 0x84,
    0x03, 0xA5, 0x00,
    0xAF, 0x81, 0x4A, 0x02, 0x41, 0xA4, 0x81, 0x4A, 0x22, 0x41,
    0x81, 0x02, 0xA1, 0x8B, 0x21, 0x01, 0x81, 0x03, 0xA2, 0x81,
    0x06, 0x21, 0x02, 0x21, 0x05, 0x21, 0x01, 0xA1, 0x82, 0x01,
    0x84, 0x03, 0x81, 0x02, 0x21, 0x01, 0x81, 0x02, 0xA1, 0x81,
    0x06, 0x81, 0x03, 0x82, 0x02, 0x81, 0x01, 0xA2, 0x81, 0x02,
    0x21, 0x81, 0x02, 0x81, 0x01, 0x82, 0x02, 0x83, 0x01, 0xA2,
    0x81, 0x01, 0x21, 0x01, 0x81, 0x21, 0x83, 0x04, 0x83, 0x01,
    0xA2, 0x83, 0x02, 0x21, 0x01, 0x81, 0x02, 0x81, 0x02, 0x83,
    0x01, 0xA2, 0x83, 0x04, 0x21, 0x01, 0x82, 0x01, 0x81, 0x02,
    0x81, 0x01, 0xA2, 0x01, 0x81, 0x01, 0x21, 0x02, 0x81, 0x02,
    0x21, 0x02, 0x21, 0x01, 0x21, 0x03, 0xA1, 0x01, 0x81, 0x02,
    0x21, 0x02, 0x21, 0x81, 0x23, 0x02, 0x81, 0x03, 0xA1, 0x01,
    0x81, 0x02, 0x81, 0x02, 0x21, 0x06, 0xA5, 0x01, 0x81, 0x01,
    0xC1, 0x82, 0x02, 0x81, 0x02, 0x81, 0x02, 0xA1, 0x01, 0xAE,
    0x00,
    0xA4, 0x81, 0x02, 0xAE, 0x81, 0x02, 0x81, 0x03, 0x42, 0x81,
    0x46, 0xA1, 0x81, 0x02, 0x81, 0x01, 0x81, 0x01, 0x85, 0x01,
    0x43, 0xA1, 0x82, 0x21, 0x81, 0x04, 0x48, 0xA1, 0x81, 0x03,
    0x82, 0x21, 0x86, 0x02, 0xA4, 0x81, 0x01, 0x21, 0x01, 0x81,
    0x05, 0x86, 0xC1, 0x01, 0xA1, 0x82, 0x21, 0x01, 0x81, 0x01,
    0x21, 0x03, 0x86, 0x02, 0xA1, 0x81, 0x02, 0x21, 0x01, 0x81,
    0x23, 0x82, 0x07, 0xA1, 0x81, 0x06, 0x81, 0x04, 0x81, 0x21,
    0x81, 0x21, 0xA3, 0x81, 0x01, 0x84, 0x01, 0x81, 0x25, 0x04,
    0xA1, 0x81, 0x01, 0x81, 0x04, 0x21, 0x05, 0x81, 0x03, 0xA1,
    0x81, 0x01, 0x81, 0x03, 0x82, 0x08, 0xA3, 0x81, 0x01, 0x86,
    0x21, 0x86, 0x01, 0x21, 0x01, 0xA1, 0x81, 0x08, 0x81, 0x04,
    0x81, 0x03, 0xA1, 0x8A, 0x04, 0xA5, 0x00,
    0x01, 0xA7, 0x01, 0x81, 0x02, 0x81, 0x02, 0xA5, 0x82, 0x02,
    0x81, 0x02, 0x81, 0x43, 0xA3, 0x81, 0x02, 0x21, 0x81, 0x02,
    0x81, 0x43, 0x02, 0xA1, 0x81, 0x01, 0x21, 0x01, 0x81, 0x22,
    0x01, 0x43, 0x02, 0xA1, 0x81, 0x02, 0x21, 0x81, 0x02, 0x81,
    0x43, 0x01, 0x41, 0xA1, 0x81, 0x03, 0x81, 0x01, 0x21, 0xA8,
    0x82, 0x21, 0x07, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x82, 0x02,
    0x81, 0x02, 0x22, 0x01, 0x81, 0x03, 0xA1, 0x01, 0x86, 0x02,
    0x82, 0x22, 0xC1, 0xA1, 0x06, 0x81, 0x06, 0xA2, 0x06, 0xA8,
    0x00,
    0x01, 0xB1, 0x01, 0x81, 0x43, 0x03, 0x81, 0x04, 0x81, 0x03,
    0xA2, 0x82, 0x45, 0x02, 0x21, 0x82, 0x01, 0x81, 0x01, 0x81,
    0x21, 0x01, 0xA1, 0x81, 0x46, 0x81, 0x02, 0x21, 0x02, 0x81,
    0x04, 0xA1, 0x81, 0x46, 0x81, 0x02, 0x81, 0x02, 0x81, 0x01,
    0x81, 0x02, 0xA1, 0x89, 0x01, 0x21, 0x02, 0x21, 0x01, 0x21,
    0x02, 0xA1, 0x02, 0x81, 0x05, 0x81, 0x21, 0x82, 0x21, 0x01,
    0x82, 0x21, 0xA2, 0x01, 0x82, 0x03, 0x21, 0x04, 0x81, 0x01,
    0x21, 0x04, 0xA1, 0x01, 0x81, 0x02, 0x82, 0x01, 0x83, 0x01,
    0x81, 0x02, 0x82, 0x21, 0x01, 0xA1, 0x01, 0x81, 0x01, 0x21,
    0x01, 0x22, 0x05, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x01, 0x81,
    0x01, 0x21, 0x04, 0x21, 0x82, 0x21, 0x01, 0xA6, 0x01, 0x87,
    0x02, 0xC1, 0x01, 0xA2, 0x07, 0xA6, 0x00,
    0x09, 0xA5, 0x05, 0x85, 0x03, 0xA1, 0x04, 0x82, 0x01, 0x21,
    0x02, 0x21, 0x02, 0xA4, 0x85, 0x01, 0x21, 0x02, 0x21, 0x01,
    0x21, 0x01, 0x82, 0x41, 0xA1, 0x81, 0x07, 0x22, 0x02, 0x82,
    0x42, 0xA1, 0x81, 0x02, 0x86, 0x01, 0x83, 0x42, 0x01, 0xA1,
    0x82, 0x01, 0x81, 0x02, 0x81, 0x04, 0x81, 0x43, 0x01, 0xA1,
    0x81, 0x01, 0x21, 0x03, 0x81, 0x04, 0x81, 0x43, 0x01, 0xA1,
    0x81, 0xC1, 0x01, 0x81, 0x21, 0x01, 0x82, 0x01, 0x84, 0x43,
    0xA1, 0x84, 0x02, 0x21, 0x01, 0x22, 0x02, 0x82, 0x42, 0xA1,
    0x03, 0x82, 0x02, 0x21, 0x01, 0x21, 0x02, 0x21, 0x43, 0xA1,
    0x04, 0x81, 0x01, 0x22, 0x02, 0x21, 0x01, 0x81, 0x02, 0x41,
    0xA1, 0x04, 0x81, 0x03, 0x21, 0x01, 0x21, 0x02, 0xA4, 0x04,
    0x86, 0x03, 0xA1, 0x09, 0xA5, 0x00,
    0xA5, 0x81, 0x03, 0xA2, 0x81, 0x01, 0x21, 0x02, 0xA9, 0x82,
    0x01, 0x81, 0x01, 0x81, 0x07, 0xA6, 0x82, 0x01, 0x81, 0x03,
    0x21, 0x81, 0x21, 0x81, 0xC1, 0x02, 0x81, 0x03, 0xA1, 0x81,
    0x02, 0x81, 0x06, 0x21, 0x01, 0x81, 0x03, 0x21, 0x01, 0xA1,
    0x81, 0x02, 0x83, 0x01, 0x89, 0x01, 0xA2, 0x81, 0x02, 0x82,
    0x01, 0x42, 0x61, 0x45, 0x01, 0x81, 0x01, 0xA2, 0x82, 0x01,
    0x82, 0x01, 0x61, 0x41, 0x61, 0x42, 0x61, 0x41, 0x61, 0x01,
    0x81, 0x01, 0xA2, 0x81, 0x01, 0x21, 0x8A, 0x01, 0x82, 0x21,
    0x01, 0xA1, 0x81, 0x02, 0x21, 0x03, 0x21, 0x02, 0x21, 0x04,
    0x21, 0x02, 0xA1, 0x81, 0x02, 0x81, 0x03, 0x81, 0x03, 0x81,
    0x03, 0x81, 0x02, 0xA1, 0xB3, 0x00,
    0x07, 0xAB, 0x07, 0x81, 0x03, 0x81, 0x05, 0xA1, 0x85, 0x02,
    0x81, 0x05, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x81, 0x03, 0x85,
    0x01, 0x21, 0x82, 0x01, 0x81, 0x01, 0xA2, 0x81, 0x01, 0x21,
    0x01, 0x82, 0x03, 0x81, 0x01, 0x82, 0x01, 0x21, 0x02, 0xA1,
    0x81, 0x01, 0x21, 0x02, 0xC1, 0x22, 0x01, 0x81, 0x01, 0x82,
    0x23, 0x01, 0xA1, 0x82, 0x01, 0x83, 0x03, 0x81, 0x01, 0x82,
    0x04, 0xA1, 0x82, 0x01, 0x81, 0x03, 0x83, 0x01, 0x85, 0x21,
    0xA1, 0x82, 0x01, 0x81, 0x05, 0x21, 0x02, 0x81, 0x44, 0xA1,
    0x81, 0x02, 0x83, 0x01, 0x82, 0x01, 0x21, 0x01, 0x81, 0x44,
    0xA2, 0x81, 0x01, 0x21, 0x03, 0x21, 0x01, 0x81, 0x03, 0x81,
    0x42, 0x21, 0x41, 0x01, 0xA1, 0x81, 0x02, 0x82, 0x01, 0x21,
    0x01, 0x81, 0x02, 0x82, 0x44, 0x01, 0xA1, 0x85, 0x03, 0x86,
    0x43, 0xA2, 0x04, 0x85, 0x04, 0xA5, 0x00,
    0x02, 0xA4, 0x02, 0x81, 0x02, 0xA9, 0x01, 0x82, 0x02, 0x82,
    0x02, 0x81, 0x03, 0xA1, 0x01, 0x81, 0x02, 0x21, 0x81, 0x01,
    0x21, 0xC1, 0x21, 0x03, 0xA4, 0x01, 0x81, 0x21, 0x02, 0x21,
    0x02, 0x81, 0x01, 0x21, 0x01, 0x21, 0x81, 0x02, 0xA2, 0x82,
    0x02, 0x21, 0x82, 0x01, 0x81, 0x21, 0x01, 0x21, 0x05, 0xA1,
    0x81, 0x02, 0x81, 0x02, 0x81, 0x01, 0x81, 0x03, 0x23, 0x02,
    0xA1, 0x81, 0x01, 0x21, 0x04, 0x21, 0x02, 0x21, 0x82, 0x01,
    0xA4, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0x81, 0x21, 0x81,
    0x02, 0x81, 0x02, 0xA1, 0x82, 0x02, 0x83, 0x02, 0x83, 0x21,
    0x01, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x44, 0x05, 0xA1, 0x01,
    0x84, 0x46, 0xA4, 0x03, 0x81, 0x44, 0xA4, 0x03, 0x81, 0x43,
    0xA2, 0x03, 0x81, 0x43, 0xA1, 0x03, 0xA5, 0x00,
    0x06, 0xA4, 0x02, 0x85, 0x02, 0xA1, 0x01, 0x82, 0x05, 0x21,
    0xA1, 0x82, 0x01, 0x21, 0x02, 0x82, 0x01, 0xA3, 0x81, 0xC1,
    0x21, 0x01, 0x21, 0x01, 0x81, 0x01, 0x21, 0x02, 0xA1, 0x84,
    0x01, 0x82, 0x03, 0x21, 0xA1, 0x01, 0x81, 0x44, 0x81, 0x21,
    0x01, 0x21, 0x01, 0xA1, 0x01, 0x81, 0x44, 0x81, 0x03, 0x21,
    0xA1, 0x01, 0x81, 0x44, 0x02, 0x22, 0x01, 0xA2, 0x01, 0x81,
    0x43, 0x01, 0x81, 0x01, 0x21, 0x03, 0xA1, 0x01, 0x86, 0x21,
    0x01, 0x21, 0x02, 0xA1, 0x06, 0x81, 0x03, 0xA3, 0x06, 0x81,
    0x21, 0x01, 0xA3, 0x06, 0x81, 0x02, 0xA1, 0x06, 0xA4, 0x00,
    0xAC, 0x82, 0x05, 0x82, 0x02, 0xA1, 0x82, 0x03, 0x21, 0x03,
    0x21, 0x01, 0xA1, 0x84, 0x01, 0x82, 0x01, 0x22, 0x01, 0xA1,
    0x81, 0x03, 0x21, 0x01, 0x81, 0x04, 0xA1, 0x81, 0x01, 0x23,
    0x01, 0x81, 0x01, 0xA4, 0x81, 0x03, 0x81, 0x01, 0x81, 0x01,
    0x21, 0x01, 0xA2, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x21,
    0x01, 0xA1, 0x81, 0x01, 0x21, 0x81, 0x01, 0x21, 0x81, 0x04,
    0xA1, 0x81, 0x03, 0x42, 0x81, 0x01, 0xA4, 0x84, 0x42, 0x01,
    0x21, 0x01, 0x81, 0xC1, 0xA1, 0x81, 0x45, 0x81, 0x01, 0x21,
    0x81, 0x01, 0xA1, 0x82, 0x44, 0x81, 0x02, 0x21, 0x01, 0xA1,
    0x83, 0x42, 0x82, 0x04, 0xA1, 0xAC, 0x00,
    0x01, 0xA9, 0x01, 0x81, 0x44, 0x03, 0xA2, 0x01, 0x81, 0x41,
    0x81, 0x41, 0x81, 0x02, 0x21, 0x01, 0xA2, 0x82, 0x44, 0x81,
    0x01, 0x81, 0x01, 0xC1, 0xA2, 0x81, 0x01, 0x44, 0x81, 0x02,
    0x81, 0x02, 0xA2, 0x81, 0x05, 0x81, 0x21, 0x01, 0x82, 0x21,
    0x01, 0xA1, 0x82, 0x01, 0x83, 0x02, 0x21, 0x04, 0xA1, 0x01,
    0x81, 0x21, 0x02, 0x21, 0x01, 0x21, 0x01, 0x21, 0x81, 0x02,
    0xA1, 0x01, 0x81, 0x01, 0x81, 0x02, 0x21, 0x01, 0x21, 0x01,
    0x82, 0x01, 0xA1, 0x01, 0x81, 0x02, 0x83, 0x02, 0x82, 0x02,
    0xA1, 0x01, 0x81, 0x04, 0x82, 0x01, 0x82, 0x01, 0xA2, 0x01,
    0x81, 0x02, 0x21, 0x01, 0x81, 0x02, 0x21, 0x02, 0xA1, 0x01,
    0x83, 0x21, 0x01, 0x21, 0x03, 0xA3, 0x03, 0x81, 0x02, 0xA5,
    0x03, 0xA4, 0x00,
    0x8C, 0x01, 0xA6, 0x81, 0x03, 0x81, 0x04, 0x81, 0x01, 0x83,
    0x44, 0xA1, 0x81, 0x03, 0x22, 0x81, 0x03, 0xC1, 0x02, 0x45,
    0xA1, 0x81, 0x03, 0x81, 0x01, 0x83, 0x03, 0x81, 0x01, 0x44,
    0xA1, 0x82, 0x01, 0x82, 0x01, 0x83, 0x02, 0x81, 0x02, 0x44,
    0xA1, 0x01, 0x81, 0x01, 0x21, 0x01, 0x21, 0x05, 0x81, 0x01,
    0x81, 0x01, 0xA4, 0x01, 0x81, 0x02, 0x21, 0x01, 0x21, 0x82,
    0x02, 0x81, 0x06, 0xA1, 0x84, 0x01, 0x81, 0x02, 0x84, 0x01,
    0x81, 0x01, 0x82, 0x01, 0xA1, 0x81, 0x02, 0x81, 0x01, 0x81,
    0x21, 0x03, 0x82, 0x01, 0x81, 0x04, 0xA1, 0x81, 0x01, 0x21,
    0x02, 0x21, 0x02, 0x81, 0x01, 0x82, 0x01, 0x81, 0x03, 0xA2,
    0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x21, 0x04, 0x81, 0x01,
    0x81, 0x03, 0xA1, 0x81, 0x02, 0x21, 0x01, 0x82, 0x01, 0x82,
    0x01, 0x81, 0x01, 0xA5, 0x81, 0x01, 0x22, 0x05, 0x22, 0x02,
    0xA1, 0x82, 0x01, 0x82, 0x01, 0x83, 0x01, 0x21, 0x02, 0xA1,
    0x01, 0x81, 0x04, 0x81, 0x01, 0x81, 0x04, 0xA1, 0x01, 0x86,
    0x01, 0xA6, 0x00,
    0x0C, 0xA5, 0x85, 0x02, 0x86, 0x03, 0xA1, 0x81, 0x03, 0x84,
    0x02, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x81, 0x01,
    0x21, 0x03, 0x82, 0x01, 0x82, 0x01, 0x82, 0x02, 0xA2, 0x81,
    0x03, 0x21, 0x01, 0x21, 0x05, 0x21, 0x02, 0x21, 0x01, 0xA1,
    0x83, 0x01, 0x21, 0x02, 0x82, 0x01, 0x82, 0x05, 0xA2, 0x02,
    0x81, 0x01, 0x85, 0x01, 0x85, 0x22, 0x01, 0xA1, 0x01, 0x82,
    0x21, 0x85, 0x01, 0xC1, 0x82, 0x05, 0xA1, 0x01, 0x81, 0x01,
    0x21, 0x02, 0x83, 0x21, 0x83, 0x01, 0x21, 0x02, 0xA2, 0x01,
    0x81, 0x01, 0x21, 0x02, 0x81, 0x03, 0x83, 0x02, 0xA3, 0x01,
    0x81, 0x01, 0x22, 0x01, 0x21, 0x01, 0x81, 0x03, 0x22, 0x01,
    0xA1, 0x01, 0x81, 0x05, 0x81, 0x03, 0x82, 0x02, 0xA1, 0x01,
    0x87, 0x42, 0x01, 0x41, 0xA3, 0x04, 0x81, 0x49, 0xA1, 0x04,
    0x81, 0x49, 0xA1, 0x04, 0xAB, 0x00,
    0xAB, 0x81, 0x46, 0x03, 0xA9, 0x81, 0x46, 0x03, 0x81, 0x02,
    0x82, 0x03, 0xA1, 0x81, 0x42, 0x83, 0x01, 0x21, 0x04, 0x21,
    0x05, 0xA1, 0x81, 0x43, 0x01, 0x21, 0x01, 0x21, 0x01, 0x81,
    0x03, 0x82, 0x03, 0xA1, 0x81, 0x43, 0x81, 0x21, 0x85, 0x04,
    0x81, 0x02, 0xA1, 0x83, 0x04, 0x81, 0x03, 0x81, 0x21, 0x02,
    0x81, 0x21, 0x01, 0xA1, 0x02, 0x81, 0x02, 0x22, 0x01, 0x21,
    0x01, 0x21, 0x02, 0x21, 0x82, 0x02, 0xA1, 0x02, 0x81, 0x02,
    0x21, 0x03, 0x81, 0x21, 0x81, 0x21, 0x01, 0x82, 0x21, 0x01,
    0xA1, 0x02, 0x83, 0x01, 0x82, 0x01, 0x81, 0x04, 0x82, 0x02,
    0xA1, 0x03, 0x81, 0x02, 0x21, 0x01, 0x21, 0x01, 0x82, 0x01,
    0xA6, 0x03, 0x81, 0x04, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x03,
    0x82, 0x03, 0x81, 0x01, 0x81, 0x03, 0xA1, 0x04, 0x85, 0xC1,
    0xA5, 0x08, 0xA3, 0x00,
    0x06, 0xA4, 0x87, 0x01, 0xC1, 0xA1, 0x81, 0x05, 0x21, 0x02,
    0xA1, 0x81, 0x03, 0x21, 0x82, 0x01, 0x21, 0xA1, 0x82, 0x21,
    0x81, 0x43, 0x81, 0x01, 0xA1, 0x01, 0x81, 0x01, 0x21, 0x43,
    0x02, 0xA1, 0x01, 0x81, 0x01, 0x81, 0x41, 0x01, 0x41, 0x81,
    0x01, 0xA2, 0x01, 0x81, 0x03, 0x81, 0x01, 0x81, 0x21, 0x01,
    0xA1, 0x01, 0x81, 0x21, 0x02, 0x21, 0x04, 0xA1, 0x01, 0x81,
    0x02, 0xA7, 0x01, 0xA4, 0x00,
    0x0D, 0xA6, 0x01, 0x8D, 0x44, 0xA1, 0x82, 0x03, 0x82, 0x05,
    0x82, 0x44, 0xA1, 0x81, 0x02, 0x22, 0x82, 0x02, 0x21, 0x01,
    0xC1, 0x82, 0x44, 0xA1, 0x81, 0x06, 0x22, 0x01, 0x21, 0x81,
    0x02, 0x44, 0xA1, 0x81, 0x02, 0x21, 0x01, 0x82, 0x01, 0x22,
    0x01, 0x81, 0x01, 0x81, 0x01, 0x43, 0xA1, 0x81, 0x02, 0x21,
    0x01, 0x82, 0x01, 0x21, 0x02, 0x81, 0x02, 0x44, 0xA1, 0x82,
    0x01, 0x85, 0x01, 0x83, 0x01, 0x82, 0x41, 0xA3, 0x82, 0x03,
    0x21, 0x02, 0x21, 0x01, 0x82, 0x03, 0x41, 0x02, 0xA1, 0x81,
    0x01, 0x21, 0x83, 0x02, 0x81, 0x01, 0x85, 0x01, 0xA3, 0x81,
    0x03, 0x21, 0x03, 0x81, 0x07, 0xA1, 0x81, 0x02, 0x21, 0x01,
    0x81, 0x21, 0x01, 0x21, 0x01, 0x21, 0x83, 0x02, 0xA1, 0x81,
    0x01, 0x23, 0x81, 0x01, 0x21, 0x03, 0x81, 0x01, 0xA4, 0x81,
    0x04, 0x81, 0x02, 0x22, 0x01, 0xA1, 0x86, 0x03, 0xA3, 0x05,
    0xA5, 0x00,
    0x04, 0xAC, 0x04, 0x81, 0x0A, 0xA2, 0x04, 0x81, 0x02, 0x81,
    0x01, 0x81, 0x22, 0x01, 0x21, 0x02, 0xA1, 0x04, 0x81, 0x21,
    0x01, 0x81, 0x21, 0x81, 0x02, 0x82, 0x01, 0xC1, 0xA1, 0x03,
    0x82, 0x01, 0x82, 0x01, 0x81, 0x01, 0x21, 0x01, 0x81, 0x01,
    0xA2, 0x03, 0x81, 0x03, 0x21, 0x01, 0x81, 0x21, 0x02, 0x81,
    0x01, 0xA1, 0x03, 0x81, 0x03, 0x81, 0x01, 0x21, 0x03, 0x81,
    0x01, 0xA1, 0x03, 0x82, 0x01, 0x21, 0x01, 0x21, 0x03, 0x82,
    0x01, 0xA1, 0x03, 0x81, 0x02, 0x81, 0x02, 0x82, 0x02, 0x21,
    0x01, 0xA1, 0x03, 0x81, 0x04, 0x82, 0x01, 0x22, 0x81, 0x01,
    0xA1, 0x86, 0x22, 0x03, 0x81, 0x03, 0xA1, 0x81, 0x44, 0x81,
    0x02, 0xA8, 0x81, 0x41, 0x81, 0x43, 0x01, 0xA2, 0x81, 0x44,
    0x03, 0xA1, 0x81, 0x44, 0x03, 0xA1, 0xA9, 0x00,
    0x0B, 0xA5, 0x0A, 0x82, 0x03, 0xA2, 0x09, 0x82, 0x05, 0xA1,
    0x08, 0x82, 0x02, 0x22, 0x02, 0xA1, 0x07, 0x82, 0x01, 0x22,
    0x02, 0x21, 0x01, 0xA1, 0x07, 0x81, 0x01, 0x21, 0x04, 0x21,
    0x01, 0xA1, 0x84, 0x03, 0x81, 0x03, 0x22, 0x01, 0xA5, 0x81,
    0x02, 0x88, 0x01, 0x82, 0x04, 0xA1, 0x81, 0x41, 0x0C, 0x23,
    0xC1, 0xA1, 0x81, 0x41, 0x81, 0x01, 0x87, 0x01, 0x82, 0x03,
    0xA2, 0x81, 0x41, 0x81, 0x01, 0x87, 0x41, 0x01, 0x81, 0x21,
    0x01, 0x21, 0xA2, 0x81, 0x4B, 0x01, 0x81, 0x04, 0xA1, 0x8E,
    0x02, 0x21, 0x01, 0xA1, 0x0D, 0x82, 0x02, 0xA2, 0x0E, 0xA4,
    0x00,
    0x05, 0xA8, 0x02, 0x84, 0x06, 0xA6, 0x02, 0x81, 0x04, 0x82,
    0x01, 0x21, 0x01, 0x21, 0x03, 0xC1, 0xA1, 0x02, 0x81, 0x01,
    0x82, 0x01, 0x82, 0x21, 0x81, 0x21, 0x01, 0x21, 0x01, 0x21,
    0xA2, 0x83, 0x01, 0x46, 0x81, 0x02, 0x22, 0x01, 0xA2, 0x81,
    0x03, 0x46, 0x81, 0x02, 0x81, 0x03, 0xA1, 0x81, 0x01, 0x81,
    0x01, 0x46, 0x81, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x01,
    0x81, 0x21, 0x46, 0x01, 0x22, 0x81, 0x01, 0x21, 0x01, 0xA1,
    0x81, 0x03, 0x83, 0x01, 0x83, 0x21, 0x02, 0x21, 0x01, 0xA2,
    0x83, 0x02, 0x21, 0x02, 0x21, 0x02, 0x21, 0x02, 0x21, 0x01,
    0xA1, 0x02, 0x81, 0x02, 0x21, 0x02, 0x21, 0x02, 0x21, 0x02,
    0x21, 0x01, 0xA1, 0x02, 0x86, 0x03, 0xA6, 0x07, 0xA5, 0x00,
    0x08, 0xA7, 0x04, 0x85, 0x02, 0x81, 0x02, 0xA4, 0x04, 0x81,
    0x03, 0x81, 0x03, 0x21, 0x04, 0xA1, 0x01, 0x84, 0x01, 0x81,
    0x22, 0x01, 0x82, 0x01, 0x82, 0x02, 0xA1, 0x82, 0x06, 0x81,
    0x01, 0x81, 0x02, 0x82, 0x01, 0xA3, 0x81, 0x02, 0x83, 0x01,
    0x21, 0x81, 0x21, 0x02, 0x21, 0x02, 0x21, 0x02, 0xA1, 0x81,
    0x43, 0x04, 0x81, 0x01, 0x82, 0x02, 0x81, 0x03, 0xA1, 0x81,
    0x43, 0x81, 0x04, 0xC1, 0x01, 0x81, 0x01, 0x83, 0x01, 0xA2,
    0x81, 0x43, 0x81, 0x02, 0x83, 0x02, 0x21, 0x02, 0x21, 0x02,
    0xA1, 0x88, 0x01, 0x82, 0x03, 0x81, 0x03, 0xA1, 0x0A, 0xA9,
    0x00,
    0x01, 0xA5, 0x01, 0x81, 0x03, 0xA1, 0x01, 0x81, 0x01, 0x81,
    0x01, 0xA7, 0x01, 0x81, 0x06, 0x21, 0xC1, 0xA6, 0x01, 0x81,
    0x01, 0x21, 0x01, 0x82, 0x21, 0x01, 0x83, 0x03, 0xA1, 0x01,
    0x81, 0x01, 0x84, 0x01, 0x21, 0x04, 0x21, 0x01, 0xA1, 0x01,
    0x81, 0x01, 0x85, 0x01, 0x81, 0x02, 0x81, 0x21, 0x01, 0xA4,
    0x82, 0x02, 0x84, 0x01, 0x82, 0x21, 0x06, 0xA1, 0x81, 0x02,
    0x21, 0x81, 0x02, 0x21, 0x02, 0x81, 0x01, 0x82, 0x01, 0x82,
    0x01, 0xA1, 0x81, 0x09, 0x81, 0x01, 0x81, 0x43, 0x81, 0x01,
    0xA1, 0x86, 0x02, 0x83, 0x02, 0x43, 0x02, 0xA1, 0x05, 0x84,
    0x01, 0x81, 0x01, 0x81, 0x43, 0x81, 0x01, 0xA1, 0x0A, 0x81,
    0x01, 0x83, 0x01, 0x81, 0x01, 0xA1, 0x0A, 0x81, 0x07, 0xA1,
    0x0A, 0xA9, 0x00,
    0x85, 0x01, 0xA4, 0x81, 0x43, 0x81, 0x01, 0x81, 0x02, 0xA4,
    0x81, 0x43, 0x83, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x44, 0x82,
    0x01, 0x21, 0x02, 0x21, 0xA3, 0x82, 0x44, 0x82, 0x03, 0x21,
    0x02, 0xA1, 0x83, 0x43, 0x01, 0x82, 0x01, 0x21, 0x01, 0x21,
    0x01, 0xA1, 0x81, 0x01, 0x82, 0x04, 0x81, 0x02, 0x21, 0x02,
    0xA1, 0x81, 0x02, 0x82, 0x01, 0x81, 0x01, 0x83, 0x01, 0xA4,
    0x81, 0x01, 0x21, 0x01, 0x81, 0x01, 0x81, 0x21, 0x02, 0x21,
    0x04, 0xA1, 0x81, 0x02, 0x21, 0x01, 0xC1, 0x01, 0x21, 0x04,
    0x21, 0x02, 0xA1, 0x81, 0x03, 0x81, 0x01, 0x21, 0x01, 0x22,
    0x01, 0x21, 0x01, 0xA3, 0x81, 0x02, 0x86, 0x02, 0xA3, 0x81,
    0x01, 0x82, 0x04, 0xA4, 0xA3, 0x00,
    0xAA, 0x81, 0x08, 0xA4, 0x81, 0x01, 0x86, 0x01, 0x81, 0x02,
    0xA2, 0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21,
    0x02, 0x21, 0x01, 0xA1, 0x81, 0x07, 0x81, 0x21, 0x03, 0xA1,
    0x83, 0x21, 0x02, 0x22, 0x81, 0x02, 0xA3, 0x02, 0x81, 0x02,
    0x82, 0x01, 0x81, 0x01, 0x21, 0xA2, 0x02, 0x82, 0x21, 0x81,
    0x03, 0x21, 0x01, 0xC1, 0xA1, 0x03, 0x81, 0x02, 0x21, 0x01,
    0x21, 0x01, 0xA3, 0x03, 0x81, 0x01, 0x81, 0x03, 0x21, 0x02,
    0xA1, 0x03, 0x81, 0x01, 0x82, 0x03, 0x81, 0x01, 0xA1, 0x02,
    0x82, 0x02, 0x85, 0x01, 0xA1, 0x02, 0x81, 0x09, 0xA1, 0x02,
    0x81, 0x47, 0xA3, 0x02, 0x81, 0x47, 0xA1, 0x02, 0xA9, 0x00,
    0x09, 0xA4, 0x01, 0x89, 0x02, 0xA2, 0x82, 0x02, 0x21, 0x06,
    0x21, 0x01, 0xA5, 0x81, 0x03, 0x82, 0x01, 0x82, 0x03, 0x82,
    0x43, 0xA1, 0x81, 0x01, 0x81, 0x22, 0x01, 0x21, 0x01, 0x22,
    0x81, 0x21, 0x82, 0x43, 0xA1, 0x81, 0x01, 0x81, 0x03, 0xC1,
    0x03, 0x81, 0x03, 0x43, 0xA1, 0x81, 0x02, 0x21, 0x81, 0x01,
    0x83, 0x22, 0x03, 0x43, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x22,
    0x02, 0x21, 0x01, 0x82, 0x44, 0xA1, 0x83, 0x21, 0x07, 0xA7,
    0x02, 0x81, 0x02, 0xA7, 0x02, 0xA4, 0x00,
    0x02, 0xA9, 0x02, 0x81, 0x61, 0x41, 0x61, 0x81, 0x61, 0x41,
    0x61, 0xA1, 0x02, 0x81, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61,
    0x41, 0xA1, 0x02, 0x81, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41,
    0x61, 0xA1, 0x02, 0x81, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61,
    0x41, 0xA1, 0x02, 0x81, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41,
    0x61, 0xA1, 0x02, 0x83, 0x03, 0xA3, 0x04, 0x81, 0x03, 0xA1,
    0x86, 0x01, 0xA6, 0x81, 0x0B, 0xA1, 0x81, 0x01, 0x21, 0x01,
    0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x82,
    0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0xA2,
    0x01, 0x81, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01,
    0x21, 0xA1, 0x01, 0x81, 0x03, 0x21, 0xC1, 0x21, 0x03, 0xA1,
    0x01, 0x81, 0x02, 0x85, 0x02, 0xA1, 0x01, 0x84, 0x03, 0xA4,
    0x00,
    0x07, 0xA4, 0x07, 0x81, 0x02, 0xA2, 0x07, 0x81, 0x03, 0xA2,
    0x07, 0x81, 0x01, 0x22, 0x01, 0xA2, 0x05, 0x83, 0x21, 0x02,
    0x21, 0x01, 0xA2, 0x02, 0x84, 0x04, 0x21, 0x03, 0xA1, 0x83,
    0x02, 0x81, 0x01, 0x85, 0x02, 0xA1, 0x81, 0x04, 0x81, 0x01,
    0x81, 0x44, 0x21, 0x01, 0xA1, 0x81, 0x01, 0x81, 0x03, 0x21,
    0x01, 0x44, 0x81, 0x01, 0xA1, 0x81, 0x02, 0x21, 0x01, 0x81,
    0x01, 0x81, 0x41, 0x61, 0x42, 0x81, 0x01, 0xA1, 0x83, 0x02,
    0x84, 0x01, 0x83, 0x01, 0xA1, 0x02, 0x84, 0x01, 0xC1, 0x21,
    0x02, 0x82, 0x21, 0xA2, 0x05, 0x83, 0x01, 0x21, 0x05, 0xA1,
    0x07, 0x81, 0x02, 0x82, 0x03, 0xA1, 0x07, 0xA9, 0x00,
    0x06, 0xAC, 0x05, 0x82, 0x42, 0x04, 0x81, 0x03, 0xA1, 0x04,
    0x82, 0x42, 0x61, 0x01, 0x21, 0x04, 0x21, 0x01, 0xA1, 0x03,
    0x82, 0x42, 0x61, 0x41, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01,
    0x21, 0xA2, 0x03, 0x81, 0x42, 0x61, 0x41, 0x81, 0x01, 0x81,
    0x01, 0x81, 0x01, 0x21, 0x02, 0xA1, 0x84, 0x43, 0x81, 0x02,
    0x81, 0x04, 0x81, 0x01, 0xA1, 0x81, 0x02, 0x82, 0x01, 0x81,
    0x0A, 0xA1, 0x81, 0x01, 0xC1, 0x21, 0x01, 0x21, 0x01, 0x83,
    0x02, 0x81, 0x03, 0xA2, 0x81, 0x01, 0x21, 0x03, 0x21, 0x03,
    0x81, 0x01, 0x81, 0x03, 0xA1, 0x83, 0x22, 0x03, 0x81, 0x01,
    0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0xA1, 0x02, 0x81, 0x03,
    0x21, 0x03, 0x81, 0x01, 0x81, 0x01, 0xA5, 0x02, 0x81, 0x01,
    0x21, 0x81, 0x01, 0x85, 0x06, 0xA1, 0x02, 0x81, 0x21, 0x03,
    0x81, 0x03, 0x81, 0x04, 0x81, 0x01, 0xA1, 0x02, 0x81, 0x02,
    0x83, 0x03, 0x82, 0x05, 0xA1, 0x02, 0x81, 0x02, 0x81, 0x06,
    0x81, 0x04, 0xA2, 0x02, 0x84, 0x06, 0xA6, 0x00,
    0x01, 0xA9, 0x01, 0x81, 0x07, 0xA1, 0x01, 0x81, 0x01, 0x21,
    0x01, 0x22, 0x01, 0x21, 0xA1, 0x83, 0x01, 0x81, 0x02, 0x21,
    0x01, 0xA1, 0x81, 0x41, 0x81, 0x03, 0x22, 0x01, 0xA2, 0x81,
    0x41, 0x83, 0x03, 0x21, 0x01, 0xA1, 0x81, 0x41, 0x81, 0x41,
    0x01, 0x21, 0x01, 0x82, 0x01, 0xA4, 0x81, 0x43, 0x02, 0x21,
    0x82, 0x01, 0x21, 0x02, 0xA1, 0x81, 0x43, 0x21, 0x03, 0x21,
    0x04, 0xA1, 0x81, 0x42, 0x83, 0x21, 0x83, 0x01, 0x81, 0xC1,
    0xA1, 0x81, 0x42, 0x81, 0x01, 0x81, 0x05, 0xA3, 0x84, 0x01,
    0xA7, 0x00,
    0x0B, 0xA8, 0x0B, 0x81, 0x46, 0xA1, 0x03, 0x84, 0x04, 0x81,
    0x46, 0xA1, 0x03, 0x81, 0x02, 0x89, 0x43, 0xA1, 0x03, 0x81,
    0x01, 0x21, 0x03, 0x21, 0x04, 0x81, 0x43, 0xA1, 0x03, 0x81,
    0x02, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81,
    0x03, 0xA1, 0x85, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0xC1,
    0x81, 0x01, 0x81, 0x03, 0xA1, 0x81, 0x03, 0x81, 0x01, 0x83,
    0x01, 0x83, 0x01, 0x82, 0x01, 0xA2, 0x81, 0x04, 0x21, 0x01,
    0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x81, 0x01,
    0xA1, 0x81, 0x01, 0x23, 0x02, 0x21, 0x03, 0x81, 0x05, 0xA1,
    0x81, 0x03, 0x81, 0x01, 0x83, 0x21, 0x83, 0x21, 0x82, 0x01,
    0xA1, 0x83, 0x01, 0x81, 0x02, 0x21, 0x03, 0x81, 0x05, 0xA1,
    0x01, 0x82, 0x01, 0x21, 0x02, 0x81, 0x01, 0x21, 0x01, 0x21,
    0x01, 0x21, 0x01, 0xA3, 0x01, 0x81, 0x02, 0x81, 0x01, 0x83,
    0x01, 0x83, 0x01, 0xA2, 0x01, 0x81, 0x01, 0x21, 0x0A, 0xA1,
    0x01, 0x81, 0x02, 0xAB, 0x01, 0xA4, 0x00,
    0xB4, 0x81, 0x10, 0xA3, 0x81, 0x01, 0x21, 0x81, 0x03, 0x21,
    0x01, 0x82, 0x02, 0x21, 0x04, 0xA2, 0x81, 0x04, 0x21, 0x83,
    0x04, 0x81, 0x01, 0x22, 0x01, 0xA2, 0x81, 0x41, 0x83, 0x05,
    0x21, 0x01, 0x21, 0x01, 0x82, 0x02, 0xA2, 0x81, 0x43, 0x81,
    0x02, 0x81, 0x02, 0x81, 0x04, 0x81, 0x21, 0x02, 0xA1, 0x81,
    0x42, 0x82, 0x22, 0x84, 0x01, 0x21, 0x02, 0x81, 0x03, 0xA1,
    0x81, 0x43, 0x81, 0x06, 0x21, 0x01, 0x82, 0x02, 0xA3, 0x81,
    0x43, 0x21, 0x02, 0x83, 0x02, 0x81, 0x04, 0x81, 0x01, 0xA1,
    0x82, 0x42, 0x02, 0x21, 0x81, 0x02, 0x82, 0x03, 0x82, 0xC1,
    0x01, 0xA1, 0x83, 0x41, 0x81, 0x0E, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x03, 0x81, 0x04, 0x81, 0x03, 0x81, 0x03, 0x81,
    0xC1, 0xA1, 0x81, 0x01, 0x21, 0x06, 0x21, 0x03, 0x21, 0x03,
    0x81, 0x01, 0xA1, 0x82, 0x01, 0x83, 0x42, 0x82, 0x01, 0x83,
    0x05, 0xA1, 0x81, 0x03, 0x81, 0x44, 0x81, 0x21, 0x81, 0x02,
    0x21, 0x83, 0x01, 0xA1, 0x81, 0x01, 0x21, 0x01, 0x81, 0x44,
    0x81, 0x02, 0x21, 0x02, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x81,
    0x03, 0x81, 0x44, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x01, 0x21, 0x01, 0xA1, 0x81, 0x03, 0x82, 0x42, 0x82, 0x03,
    0x81, 0x21, 0x81, 0x03, 0xA1, 0x82, 0x21, 0x82, 0x04, 0x82,
    0x02, 0x81, 0x02, 0x81, 0x21, 0xA2, 0x81, 0x03, 0x21, 0x02,
    0x21, 0x05, 0x81, 0x02, 0x81, 0x02, 0xA1, 0x81, 0x03, 0x81,
    0x04, 0x81, 0x03, 0x81, 0x05, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x04, 0xC1, 0x82, 0x06, 0x81, 0x03, 0xA2, 0x81,
    0x04, 0x82, 0x04, 0x21, 0x04, 0x21, 0x01, 0xA2, 0x81, 0x02,
    0x83, 0x44, 0x81, 0x01, 0x81, 0x01, 0x81, 0x02, 0xA3, 0x81,
    0x03, 0x81, 0x44, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x03, 0xA1, 0x83, 0x01, 0x81, 0x43, 0x81, 0x02, 0x81, 0x07,
    0xA1, 0x82, 0x02, 0x82, 0x41, 0x81, 0x05, 0x21, 0x03, 0x21,
    0x01, 0xA1, 0x82, 0x02, 0x21, 0x01, 0x21, 0x01, 0x83, 0x02,
    0x81, 0x01, 0x81, 0x01, 0xA3, 0x82, 0x01, 0x21, 0x07, 0x81,
    0x01, 0x81, 0x01, 0x21, 0x03, 0xA1, 0x84, 0x01, 0x21, 0x02,
    0x21, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x01, 0xA1, 0x84, 0x09, 0x81, 0x01, 0x81, 0x02, 0xA2, 0xB4,
    0x00,
    0xB4, 0x81, 0x02, 0x81, 0x02, 0x82, 0x04, 0x81, 0x03, 0xC1,
    0xA3, 0x82, 0x04, 0x21, 0x04, 0x81, 0x01, 0x21, 0x83, 0x02,
    0xA1, 0x82, 0x21, 0x81, 0x01, 0x21, 0x01, 0x82, 0x21, 0x81,
    0x01, 0x21, 0x01, 0x21, 0x04, 0xA1, 0x81, 0x03, 0x21, 0x81,
    0x04, 0x21, 0x06, 0xA3, 0x81, 0x01, 0x82, 0x03, 0x21, 0x01,
    0x83, 0x02, 0x81, 0x44, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x44,
    0xA2, 0x81, 0x04, 0x21, 0x01, 0x21, 0x01, 0x81, 0x02, 0x81,
    0x44, 0xA3, 0x82, 0x21, 0x01, 0x83, 0x02, 0x21, 0x01, 0x81,
    0x44, 0xA4, 0x81, 0x02, 0x81, 0x01, 0x21, 0x08, 0xA6, 0x81,
    0x06, 0x81, 0x01, 0x81, 0x04, 0xA6, 0xB4, 0x00,
    0xB4, 0x81, 0xC1, 0x05, 0x83, 0x03, 0x81, 0x02, 0x81, 0x02,
    0xA1, 0x81, 0x01, 0x81, 0x01, 0x81, 0x02, 0x81, 0x02, 0x21,
    0x02, 0x21, 0x05, 0xA1, 0x85, 0x05, 0x81, 0x01, 0x21, 0x01,
    0x21, 0x81, 0x21, 0x81, 0x01, 0xA1, 0x81, 0x41, 0x81, 0x42,
    0x81, 0x04, 0x82, 0x21, 0x01, 0x21, 0x04, 0xA1, 0x81, 0x45,
    0x04, 0x21, 0x03, 0x81, 0x03, 0xA2, 0x81, 0x45, 0x04, 0x83,
    0x21, 0x82, 0x21, 0xA3, 0x81, 0x41, 0x81, 0x42, 0x81, 0x04,
    0x21, 0x04, 0x81, 0x03, 0xA1, 0x85, 0x05, 0x81, 0x02, 0x81,
    0x21, 0x02, 0x21, 0x01, 0xA1, 0x85, 0x02, 0x81, 0x02, 0x21,
    0x04, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x85, 0x02, 0x81, 0x02,
    0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0xA1, 0xB4, 0x00,
    0xB4, 0x82, 0x43, 0x03, 0x82, 0x01, 0x81, 0x04, 0x81, 0x02,
    0xA1, 0x81, 0x44, 0x09, 0x21, 0x01, 0x82, 0x01, 0xA1, 0x81,
    0x44, 0x81, 0x01, 0x81, 0x01, 0x81, 0x21, 0x83, 0x21, 0x04,
    0xA1, 0x81, 0x43, 0x81, 0x04, 0x81, 0x07, 0x81, 0x01, 0xA1,
    0x82, 0x41, 0x81, 0x02, 0x81, 0x21, 0x01, 0x81, 0x05, 0x21,
    0x82, 0x01, 0xA1, 0x81, 0x02, 0x81, 0x02, 0x81, 0x01, 0x21,
    0x01, 0x21, 0x01, 0x83, 0x02, 0x21, 0x01, 0xA1, 0x81, 0x05,
    0x21, 0x02, 0x21, 0x01, 0x81, 0x02, 0x81, 0x01, 0x82, 0x01,
    0xA1, 0x82, 0x01, 0x81, 0x01, 0x82, 0x01, 0x81, 0x22, 0x81,
    0x01, 0x21, 0x81, 0x02, 0x81, 0x01, 0xA1, 0x81, 0x02, 0x81,
    0x03, 0x21, 0x01, 0x21, 0x01, 0x81, 0x06, 0xA2, 0x81, 0x04,
    0x81, 0x05, 0x81, 0x02, 0x81, 0x03, 0xC1, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x03, 0x81, 0x02, 0x81, 0xC1, 0x81, 0x01, 0x82,
    0x02, 0xA5, 0x81, 0x01, 0x81, 0x01, 0x81, 0x02, 0x21, 0x04,
    0x21, 0x02, 0xA5, 0x81, 0x01, 0x81, 0x04, 0x86, 0x01, 0x21,
    0x02, 0xA3, 0x81, 0x03, 0x81, 0x02, 0x81, 0x44, 0x81, 0x02,
    0x22, 0x02, 0xA1, 0x82, 0x21, 0x82, 0x21, 0x82, 0x44, 0x81,
    0x06, 0xA1, 0x81, 0x06, 0x81, 0x44, 0x82, 0x21, 0x82, 0x21,
    0xA2, 0x81, 0x02, 0x22, 0x02, 0x81, 0x44, 0x81, 0x06, 0xA1,
    0x81, 0x01, 0x21, 0x02, 0x21, 0x02, 0x81, 0x02, 0x81, 0x02,
    0x83, 0x02, 0xA1, 0x85, 0x02, 0x21, 0x03, 0x21, 0x04, 0x21,
    0x02, 0xA1, 0x85, 0x01, 0x81, 0x04, 0x81, 0x02, 0x81, 0x03,
    0xA2, 0xB4, 0x00,
    0xB4, 0x81, 0x01, 0x81, 0x05, 0x81, 0x0A, 0xA1, 0x81, 0x07,
    0x21, 0x02, 0x82, 0x01, 0x83, 0x01, 0xA2, 0x85, 0x02, 0x82,
    0x03, 0x21, 0x02, 0x21, 0x03, 0xA1, 0x82, 0x42, 0x82, 0x02,
    0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x81, 0x01, 0x81, 0x02,
    0xA1, 0x81, 0x44, 0x02, 0x21, 0x05, 0x82, 0x21, 0x81, 0x01,
    0xA2, 0x81, 0x44, 0x02, 0x21, 0x85, 0x03, 0x81, 0x21, 0xA2,
    0x82, 0x42, 0x81, 0x01, 0x81, 0x02, 0x81, 0x03, 0x81, 0x02,
    0x21, 0x02, 0xA1, 0x83, 0x41, 0x81, 0x01, 0x81, 0x02, 0x21,
    0x03, 0x21, 0x02, 0x81, 0x01, 0xC1, 0xA1, 0x82, 0x02, 0x21,
    0x02, 0x21, 0x01, 0x81, 0x03, 0x81, 0x02, 0xA4, 0x82, 0x07,
    0xAB, 0xB4, 0x00,
    0xB4, 0x81, 0x05, 0x83, 0x42, 0x83, 0x05, 0xA1, 0x81, 0x01,
    0x22, 0x02, 0x83, 0x42, 0x83, 0x02, 0x21, 0xC1, 0x01, 0xA1,
    0x81, 0x02, 0x81, 0x01, 0x82, 0x46, 0x81, 0x02, 0x21, 0x02,
    0xA1, 0x81, 0x05, 0x81, 0x46, 0x81, 0x02, 0x21, 0x02, 0xA1,
    0x84, 0x02, 0x83, 0x42, 0x86, 0x21, 0x01, 0xA1, 0x81, 0x03,
    0x23, 0x01, 0x81, 0x42, 0x81, 0x04, 0x81, 0x02, 0xA1, 0x81,
    0x01, 0x21, 0x81, 0x03, 0x21, 0x02, 0x21, 0x02, 0x22, 0x01,
    0x81, 0x21, 0x01, 0xA1, 0x81, 0x02, 0x81, 0x02, 0x82, 0x01,
    0x21, 0x02, 0x82, 0x02, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x21,
    0x04, 0x21, 0x01, 0x82, 0x01, 0x21, 0x04, 0x21, 0x01, 0xA1,
    0x81, 0x02, 0x81, 0x02, 0x82, 0x04, 0x82, 0x02, 0x81, 0x02,
    0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x04, 0x81, 0x02, 0x81, 0x01, 0x81, 0x02, 0x81,
    0x02, 0x81, 0x02, 0xA1, 0x81, 0x01, 0xC1, 0x81, 0x01, 0x81,
    0x01, 0x82, 0x01, 0x21, 0x03, 0x21, 0x03, 0xA2, 0x84, 0x01,
    0x81, 0x04, 0x81, 0x02, 0x81, 0x01, 0x21, 0x03, 0xA1, 0x81,
    0x04, 0x81, 0x01, 0x82, 0x01, 0x81, 0x21, 0x01, 0x82, 0x01,
    0x82, 0x01, 0xA1, 0x81, 0x06, 0x21, 0x03, 0x21, 0x03, 0x21,
    0x03, 0xA1, 0x81, 0x42, 0x83, 0x22, 0x82, 0x01, 0x21, 0x82,
    0x21, 0x01, 0x82, 0x01, 0xA1, 0x81, 0x42, 0x81, 0x41, 0x81,
    0x02, 0x81, 0x01, 0x21, 0x03, 0x21, 0x01, 0x81, 0x02, 0xA1,
    0x81, 0x44, 0x81, 0x01, 0x22, 0x03, 0x82, 0x21, 0x01, 0xA4,
    0x81, 0x44, 0x81, 0x02, 0x85, 0x06, 0xA1, 0x81, 0x43, 0x83,
    0x08, 0x82, 0x02, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x44, 0x81, 0x07, 0x81, 0x02, 0x81, 0x02, 0xA1,
    0x81, 0x44, 0x81, 0x01, 0x81, 0x01, 0x21, 0x02, 0x21, 0x06,
    0xA1, 0x81, 0x44, 0x01, 0x82, 0x02, 0x21, 0x81, 0x01, 0x81,
    0x01, 0x21, 0x81, 0x21, 0x01, 0xA1, 0x81, 0x43, 0x81, 0x03,
    0x21, 0x03, 0x21, 0x81, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x42,
    0x84, 0x02, 0x81, 0x01, 0x21, 0x03, 0x22, 0x02, 0xA1, 0x81,
    0x06, 0x84, 0x01, 0x84, 0x01, 0xA3, 0x81, 0x08, 0x81, 0x03,
    0x81, 0x05, 0xA1, 0x81, 0x01, 0x82, 0x03, 0x81, 0x03, 0x21,
    0x01, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0xA1, 0x81, 0x01,
    0x82, 0x04, 0x21, 0x01, 0x82, 0x01, 0x21, 0x02, 0x21, 0x02,
    0xA1, 0x81, 0x05, 0xC1, 0x81, 0x05, 0x81, 0x03, 0x81, 0x01,
    0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x44, 0x83, 0x0B, 0xA1, 0x81, 0x44, 0x85, 0x01,
    0x81, 0x02, 0x81, 0x21, 0x81, 0x01, 0xA2, 0x81, 0x44, 0x83,
    0x03, 0x81, 0x21, 0x02, 0x21, 0x03, 0xA1, 0x81, 0x44, 0x83,
    0x04, 0x21, 0x02, 0x81, 0x22, 0xA2, 0x82, 0x02, 0x84, 0x01,
    0x21, 0x81, 0x02, 0x81, 0x21, 0x01, 0x21, 0x02, 0xA1, 0x82,
    0x02, 0x84, 0x02, 0x21, 0x02, 0x21, 0x02, 0x81, 0x02, 0xA1,
    0x81, 0xC1, 0x02, 0x84, 0x21, 0x83, 0x21, 0x82, 0x01, 0x21,
    0x02, 0xA1, 0x82, 0x08, 0x81, 0x02, 0x81, 0x02, 0x21, 0x02,
    0xA1, 0x82, 0x03, 0x83, 0x02, 0x81, 0x02, 0x21, 0x02, 0xA4,
    0x88, 0x02, 0x81, 0x02, 0x81, 0x05, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x05, 0x81, 0x05, 0xC1, 0x81, 0x43, 0xA3, 0x81,
    0x05, 0x81, 0x06, 0x82, 0x43, 0xA2, 0x81, 0x01, 0x81, 0x01,
    0x81, 0x01, 0x82, 0x21, 0x82, 0x01, 0x82, 0x01, 0x44, 0xA1,
    0x81, 0x03, 0x21, 0x01, 0x81, 0x03, 0x23, 0x02, 0x44, 0xA1,
    0x83, 0x21, 0x83, 0x01, 0x22, 0x02, 0x83, 0x01, 0x82, 0x41,
    0xA1, 0x81, 0x05, 0x21, 0x02, 0x81, 0x04, 0x81, 0x01, 0xA4,
    0x81, 0x02, 0x21, 0x02, 0x81, 0x02, 0x83, 0x02, 0x81, 0x01,
    0x81, 0x02, 0xA1, 0x82, 0x01, 0x81, 0x21, 0x82, 0x04, 0x21,
    0x02, 0x22, 0x03, 0xA1, 0x81, 0x03, 0x21, 0x01, 0x82, 0x03,
    0x81, 0x02, 0x81, 0x01, 0x81, 0x02, 0xA1, 0x81, 0x05, 0x81,
    0x04, 0x81, 0x02, 0x81, 0x04, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x05, 0x81, 0x02, 0x81, 0x43, 0x81, 0xC1, 0x04,
    0xA1, 0x81, 0x01, 0x81, 0x07, 0x44, 0x81, 0x04, 0xA1, 0x81,
    0x02, 0x21, 0x02, 0x81, 0x03, 0x81, 0x44, 0x81, 0x03, 0xA1,
    0x81, 0x01, 0x82, 0x21, 0x84, 0x01, 0x82, 0x44, 0x81, 0x02,
    0xA1, 0x81, 0x01, 0x21, 0x03, 0x21, 0x02, 0x81, 0x02, 0x81,
    0x43, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x22, 0x01, 0x81, 0x03,
    0x81, 0x03, 0x81, 0x01, 0x22, 0x02, 0xA1, 0x83, 0x02, 0x23,
    0x81, 0x03, 0x22, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x01, 0x21,
    0x02, 0x81, 0x02, 0x81, 0x04, 0x81, 0x01, 0x21, 0x81, 0x02,
    0xA1, 0x81, 0x03, 0x21, 0x81, 0x02, 0x81, 0x07, 0x21, 0x02,
    0xA1, 0x81, 0x02, 0x81, 0x04, 0x81, 0x04, 0x81, 0x02, 0x81,
    0x02, 0xA1, 0xB4, 0x00,
    0xB4, 0x85, 0xC1, 0x83, 0x41, 0x82, 0x43, 0x82, 0x02, 0xA1,
    0x85, 0x21, 0x02, 0x42, 0x81, 0x43, 0x81, 0x04, 0xA1, 0x84,
    0x04, 0x46, 0x81, 0x02, 0x21, 0x01, 0xA1, 0x83, 0x02, 0x21,
    0x01, 0x81, 0x45, 0x82, 0x01, 0x81, 0x01, 0xA2, 0x82, 0x02,
    0x22, 0x81, 0x01, 0x85, 0x02, 0x21, 0x01, 0x21, 0x01, 0xA1,
    0x82, 0x01, 0x21, 0x81, 0x01, 0x21, 0x04, 0x82, 0x02, 0x22,
    0x02, 0xA1, 0x82, 0x02, 0x81, 0x02, 0x81, 0x04, 0x81, 0x01,
    0x21, 0x02, 0x21, 0x01, 0xA1, 0x82, 0x03, 0x22, 0x01, 0x83,
    0x01, 0x81, 0x21, 0x82, 0x03, 0xA1, 0x82, 0x01, 0x21, 0x81,
    0x06, 0x21, 0x01, 0x21, 0x02, 0x21, 0x01, 0xA2, 0x83, 0x04,
    0x81, 0x04, 0x81, 0x04, 0xA3, 0xB4, 0x00,
    0xB4, 0x81, 0xC1, 0x05, 0x81, 0x03, 0x81, 0x07, 0xA1, 0x82,
    0x01, 0x83, 0x01, 0x82, 0x02, 0x84, 0x01, 0x81, 0x01, 0xA2,
    0x81, 0x04, 0x81, 0x01, 0x81, 0x02, 0x22, 0x07, 0xA1, 0x81,
    0x02, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x81,
    0x01, 0x21, 0x01, 0x82, 0x01, 0xA2, 0x81, 0x05, 0x21, 0x01,
    0x81, 0x02, 0x81, 0x22, 0x01, 0x81, 0x03, 0xA1, 0x81, 0x02,
    0x83, 0x02, 0x81, 0x06, 0x82, 0x01, 0xA2, 0x81, 0x42, 0x81,
    0x41, 0x81, 0x01, 0x21, 0x01, 0x81, 0x02, 0x21, 0x01, 0x81,
    0x04, 0xA1, 0x81, 0x42, 0x81, 0x41, 0x81, 0x02, 0x21, 0x01,
    0x81, 0x01, 0x82, 0x01, 0x22, 0x02, 0xA1, 0x81, 0x44, 0x82,
    0x03, 0x22, 0x02, 0x21, 0x02, 0x81, 0x01, 0xA1, 0x81, 0x45,
    0x82, 0x08, 0x81, 0x02, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x02, 0x81, 0x06, 0x81, 0x03, 0x81, 0x03, 0xA2,
    0x81, 0x01, 0x21, 0x81, 0x01, 0x21, 0x01, 0x21, 0x01, 0x82,
    0x43, 0x21, 0x02, 0x21, 0x01, 0xA1, 0x81, 0x02, 0x21, 0x02,
    0x81, 0x01, 0x82, 0x44, 0x81, 0x01, 0x21, 0x02, 0xA1, 0x81,
    0x01, 0x82, 0x01, 0x21, 0x01, 0x82, 0x44, 0x81, 0x03, 0x21,
    0x01, 0xA1, 0x81, 0x01, 0x21, 0x04, 0x81, 0x44, 0x82, 0x01,
    0x21, 0x03, 0xA1, 0x81, 0x01, 0x21, 0x82, 0x02, 0x81, 0x43,
    0x81, 0x07, 0xA1, 0x81, 0x03, 0x23, 0x82, 0x21, 0x82, 0x02,
    0x83, 0x01, 0xA2, 0x81, 0x01, 0x81, 0x01, 0x81, 0x02, 0x81,
    0x03, 0x81, 0x02, 0x81, 0x04, 0xA1, 0x81, 0x01, 0x21, 0x01,
    0x81, 0x02, 0x21, 0x02, 0x82, 0x07, 0xA1, 0x81, 0x04, 0x81,
    0x04, 0x81, 0xC1, 0x07, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x02, 0x81, 0x02, 0x81, 0x01, 0x81, 0x04, 0x81,
    0x02, 0x81, 0x02, 0xA1, 0x81, 0x03, 0x21, 0x06, 0x21, 0x01,
    0x21, 0x05, 0xA1, 0x82, 0x01, 0x81, 0x02, 0x81, 0x21, 0x83,
    0x21, 0x82, 0x02, 0x82, 0x01, 0xA1, 0x81, 0x03, 0x21, 0x05,
    0x21, 0x02, 0x81, 0x02, 0x21, 0x02, 0xA1, 0x81, 0x01, 0x83,
    0x21, 0x82, 0x21, 0x81, 0x03, 0x81, 0x01, 0x21, 0x03, 0xA1,
    0x81, 0x01, 0x81, 0x03, 0x21, 0x01, 0x21, 0x02, 0x86, 0x01,
    0x21, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x22, 0x01, 0x21, 0x02,
    0x81, 0xC1, 0x81, 0x41, 0x81, 0x43, 0xA1, 0x81, 0x01, 0x81,
    0x05, 0x81, 0x02, 0x81, 0x01, 0x81, 0x41, 0x81, 0x43, 0xA1,
    0x81, 0x01, 0x8A, 0x01, 0x81, 0x45, 0xA1, 0x81, 0x0C, 0x81,
    0x45, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x02, 0x81, 0x05, 0x81, 0x02, 0x82, 0x04, 0xA2,
    0x81, 0x01, 0x21, 0x81, 0x03, 0x21, 0x01, 0x81, 0x05, 0x82,
    0x02, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x21, 0x02, 0x81, 0x42,
    0x81, 0x05, 0x21, 0x01, 0xA1, 0x81, 0x01, 0x21, 0x01, 0x21,
    0x02, 0x81, 0x44, 0x81, 0x03, 0x81, 0x01, 0xA2, 0x81, 0x01,
    0x21, 0x81, 0x02, 0x81, 0x46, 0x83, 0x01, 0x21, 0x01, 0xA1,
    0x81, 0x03, 0x81, 0x02, 0x81, 0x44, 0x81, 0x02, 0x81, 0x21,
    0x02, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x84, 0x42, 0x81, 0x03,
    0x81, 0x03, 0xA1, 0x82, 0x01, 0x21, 0x03, 0x82, 0x01, 0x81,
    0x01, 0x81, 0x01, 0x21, 0x02, 0x21, 0xA2, 0x83, 0x01, 0x21,
    0x04, 0x21, 0x81, 0xC1, 0x21, 0x01, 0x21, 0x81, 0x03, 0xA1,
    0x84, 0x03, 0x81, 0x07, 0x81, 0x03, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x06, 0x44, 0x81, 0x04, 0xA4, 0x81, 0x06, 0x44,
    0x08, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x8A, 0x05, 0xA1, 0x81,
    0x01, 0x81, 0x21, 0x03, 0x81, 0x06, 0x83, 0x42, 0xA1, 0x81,
    0x02, 0x21, 0x03, 0x81, 0x22, 0x83, 0x03, 0x81, 0x42, 0xA1,
    0x81, 0x01, 0x21, 0x01, 0x83, 0x01, 0x21, 0x03, 0x21, 0x03,
    0x81, 0x42, 0xA1, 0x81, 0x01, 0x21, 0x01, 0x81, 0x03, 0x21,
    0x01, 0x21, 0x01, 0x81, 0x02, 0x82, 0x42, 0xA1, 0x81, 0x02,
    0x81, 0x02, 0x22, 0x01, 0x81, 0x01, 0x21, 0x01, 0x82, 0x03,
    0xA2, 0x81, 0xC1, 0x82, 0x01, 0x21, 0x81, 0x02, 0x21, 0x02,
    0x21, 0x05, 0xA2, 0x82, 0x07, 0x82, 0x03, 0x81, 0x02, 0xA3,
    0xB4, 0x00,
    0xB4, 0x81, 0x08, 0x81, 0x03, 0x81, 0xC1, 0x01, 0x81, 0x02,
    0xA1, 0x81, 0x01, 0x22, 0x02, 0x81, 0x22, 0x81, 0x01, 0x81,
    0x01, 0x81, 0x02, 0x82, 0x01, 0xA1, 0x81, 0x02, 0x81, 0x01,
    0x21, 0x01, 0x21, 0x01, 0x81, 0x22, 0x01, 0x81, 0x05, 0xA1,
    0x82, 0x01, 0x81, 0x02, 0x81, 0x02, 0x81, 0x01, 0x81, 0x01,
    0x81, 0x02, 0x81, 0x02, 0xA1, 0x81, 0x03, 0x82, 0x07, 0x81,
    0x05, 0xA1, 0x81, 0x03, 0x81, 0x01, 0x21, 0x01, 0x81, 0x03,
    0x81, 0x03, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x21, 0x01, 0x81,
    0x21, 0x01, 0x81, 0x03, 0x81, 0x02, 0x21, 0x01, 0x81, 0x42,
    0xA1, 0x82, 0x21, 0x01, 0x81, 0x02, 0x84, 0x04, 0x81, 0x43,
    0xA1, 0x81, 0x02, 0x21, 0x0A, 0x81, 0x44, 0xA1, 0x81, 0x03,
    0x81, 0x02, 0x81, 0x05, 0x81, 0x45, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x05, 0x81, 0x03, 0x85, 0x04, 0xA1, 0x82, 0x01,
    0x21, 0x02, 0x81, 0x03, 0x84, 0x02, 0x21, 0x02, 0xA1, 0x84,
    0x01, 0x22, 0x03, 0x81, 0x42, 0x81, 0x02, 0x81, 0x02, 0xA1,
    0x81, 0x02, 0x21, 0x02, 0x21, 0x02, 0x82, 0x42, 0x84, 0x01,
    0xA2, 0x81, 0x01, 0x21, 0x03, 0x83, 0x44, 0x03, 0x22, 0x01,
    0xA1, 0x81, 0x02, 0x81, 0x21, 0x81, 0x03, 0x44, 0x81, 0x01,
    0x81, 0x01, 0x21, 0x01, 0xA1, 0x81, 0x01, 0x81, 0x02, 0x81,
    0x01, 0x21, 0x01, 0x42, 0x83, 0x21, 0x81, 0x03, 0xA1, 0x81,
    0x01, 0x81, 0x03, 0x21, 0x01, 0x81, 0x42, 0x81, 0x03, 0x82,
    0x02, 0xA1, 0x81, 0x03, 0x21, 0x81, 0x02, 0x84, 0x03, 0x81,
    0x01, 0x21, 0xA2, 0x81, 0x01, 0x81, 0x02, 0x81, 0x04, 0xC1,
    0x81, 0x06, 0xA2, 0xB4, 0x00,
    0xB4, 0x81, 0x03, 0x81, 0x03, 0x81, 0x04, 0x81, 0x03, 0x81,
    0xC1, 0xA1, 0x81, 0x03, 0x21, 0x02, 0x21, 0x05, 0x81, 0x01,
    0x21, 0x01, 0x81, 0x01, 0xA1, 0x82, 0x21, 0x81, 0x01, 0x21,
    0x83, 0x01, 0x81, 0x04, 0x22, 0x81, 0x01, 0xA1, 0x81, 0x02,
    0x81, 0x02, 0x81, 0x41, 0x83, 0x02, 0x81, 0x21, 0x01, 0x21,
    0x02, 0xA1, 0x81, 0x02, 0x81, 0x21, 0x81, 0x44, 0x81, 0x02,
    0x81, 0x01, 0x83, 0x01, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x81,
    0x45, 0x82, 0x04, 0x81, 0x01, 0xA1, 0x82, 0x21, 0x02, 0x81,
    0x41, 0x81, 0x44, 0x81, 0x22, 0x01, 0x21, 0x02, 0xA1, 0x81,
    0x02, 0x86, 0x42, 0x82, 0x01, 0x81, 0x02, 0x81, 0x01, 0xA1,
    0x81, 0x02, 0x21, 0x09, 0x21, 0x01, 0x83, 0x01, 0xA1, 0x81,
    0x03, 0x81, 0x03, 0x81, 0x08, 0x81, 0x01, 0xA1, 0xB4, 0x00,
    0xB4, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x03, 0x81,
    0xC1, 0x82, 0x03, 0x81, 0x01, 0xA1, 0x81, 0x0D, 0x21, 0x04,
    0xA1, 0x81, 0x02, 0x82, 0x21, 0x81, 0x01, 0x85, 0x01, 0x21,
    0x01, 0x81, 0x01, 0xA2, 0x82, 0x04, 0x82, 0x45, 0x81, 0x02,
    0x81, 0x02, 0xA1, 0x82, 0x21, 0x82, 0x21, 0x81, 0x45, 0x83,
    0x21, 0x81, 0x21, 0x01, 0xA1, 0x81, 0x03, 0x81, 0x01, 0x82,
    0x45, 0x81, 0x02, 0x81, 0x01, 0xA2, 0x81, 0x02, 0x21, 0x04,
    0x82, 0x42, 0x82, 0x02, 0x81, 0x02, 0xA1, 0x81, 0x01, 0x21,
    0x01, 0x81, 0x03, 0x21, 0x03, 0x21, 0x02, 0x23, 0x01, 0xA1,
    0x82, 0x01, 0x21, 0x02, 0x21, 0x81, 0x01, 0x81, 0x02, 0x81,
    0x02, 0x21, 0x03, 0xA1, 0x81, 0x03, 0x82, 0x03, 0x81, 0x02,
    0x81, 0x06, 0xA1, 0xB4, 0x00,
    0x86, 0x02, 0xA5, 0x81, 0x04, 0x81, 0x02, 0x81, 0x03, 0xA1,
    0x81, 0x01, 0x21, 0x02, 0x84, 0x01, 0x21, 0x01, 0xA1, 0x81,
    0x01, 0x21, 0x06, 0x21, 0x02, 0xA1, 0x81, 0x02, 0x83, 0xC1,
    0x83, 0x21, 0x01, 0xA1, 0x8A, 0x01, 0xA3, 0x81, 0x42, 0x03,
    0x82, 0x05, 0xA1, 0x81, 0x42, 0x03, 0x82, 0x21, 0x04, 0xA1,
    0x81, 0x42, 0x03, 0x82, 0x01, 0x21, 0x03, 0xA1, 0x81, 0x42,
    0x03, 0x82, 0x01, 0x21, 0x03, 0xA1, 0x81, 0x42, 0x05, 0x21,
    0x01, 0x21, 0x02, 0xA1, 0x83, 0x02, 0xA9, 0x02, 0xA4, 0x00,
    0x07, 0xAB, 0x07, 0x81, 0x09, 0xA1, 0x07, 0x81, 0x04, 0x21,
    0x01, 0x21, 0x02, 0xA1, 0x86, 0x01, 0x81, 0x01, 0x21, 0x01,
    0x85, 0x01, 0xA1, 0x81, 0x04, 0x85, 0x01, 0x21, 0x02, 0x82,
    0x21, 0xA1, 0x81, 0x07, 0x21, 0x01, 0x21, 0x06, 0xA1, 0x81,
    0x0A, 0x82, 0x01, 0x82, 0x01, 0xA1, 0x81, 0x04, 0x82, 0xC1,
    0x85, 0x01, 0x82, 0x01, 0xA1, 0x81, 0x04, 0x84, 0x03, 0x81,
    0x01, 0x82, 0x01, 0xA2, 0x81, 0x44, 0x81, 0x06, 0x81, 0x01,
    0x21, 0x03, 0xA1, 0x81, 0x44, 0x81, 0x06, 0x81, 0x05, 0xA1,
    0x86, 0x06, 0xA7, 0x00,
    0xAD, 0x81, 0x0B, 0xA1, 0x81, 0x01, 0x83, 0x01, 0x22, 0x04,
    0xA1, 0x81, 0x03, 0x81, 0x01, 0x21, 0x02, 0x21, 0x02, 0xA1,
    0x81, 0x02, 0x21, 0x84, 0x21, 0xA6, 0x81, 0x01, 0x21, 0x01,
    0x82, 0x08, 0xA5, 0x81, 0x02, 0x22, 0x01, 0x21, 0x08, 0x43,
    0xA1, 0x83, 0x01, 0x82, 0x01, 0x22, 0x81, 0x05, 0x43, 0xA1,
    0x02, 0x81, 0x01, 0x82, 0x03, 0x81, 0x05, 0x43, 0xA1, 0x02,
    0x81, 0x06, 0x81, 0x05, 0x43, 0xA1, 0x02, 0x83, 0xC1, 0xAD,
    0x04, 0xA3, 0x00,
    0x02, 0xB1, 0x83, 0xC1, 0x82, 0x09, 0x43, 0xA1, 0x81, 0x04,
    0x81, 0x09, 0x43, 0xA1, 0x81, 0x01, 0x21, 0x02, 0x81, 0x09,
    0x43, 0xA1, 0x81, 0x01, 0x22, 0x01, 0x81, 0x09, 0x43, 0xA1,
    0x82, 0x01, 0x21, 0x01, 0x83, 0x21, 0xAA, 0x01, 0x81, 0x01,
    0x83, 0x02, 0x21, 0x01, 0xA1, 0x82, 0x03, 0x21, 0x02, 0x21,
    0x01, 0xA1, 0x81, 0x02, 0x21, 0x01, 0x81, 0x02, 0x21, 0x01,
    0xA1, 0x81, 0x01, 0x21, 0x02, 0x81, 0x04, 0xA1, 0x81, 0x02,
    0x21, 0x01, 0x81, 0x04, 0xA1, 0x81, 0x04, 0x81, 0x04, 0xA1,
    0xAB, 0x00,
    0x0E, 0xA5, 0x05, 0x8A, 0x03, 0xA1, 0x05, 0x81, 0x08, 0x81,
    0x03, 0xA1, 0x05, 0x81, 0x02, 0x21, 0x01, 0x21, 0x04, 0x22,
    0x01, 0xA1, 0x05, 0x81, 0x01, 0x85, 0x01, 0x82, 0x01, 0x21,
    0x01, 0xA1, 0x05, 0x81, 0x22, 0x03, 0x81, 0x21, 0x82, 0x01,
    0x21, 0x01, 0xA1, 0x05, 0x81, 0x01, 0x83, 0x01, 0x81, 0x01,
    0x82, 0x21, 0x02, 0xA1, 0x86, 0x01, 0x83, 0x01, 0x21, 0x01,
    0x21, 0x04, 0xA1, 0x81, 0x44, 0x08, 0x82, 0x03, 0xA1, 0x81,
    0x44, 0x08, 0xA6, 0x81, 0x44, 0x08, 0xA1, 0x8B, 0xC1, 0xA2,
    0x0A, 0xA3, 0x00,
    0x04, 0xA6, 0x01, 0x84, 0x04, 0xA1, 0x01, 0x81, 0x04, 0x82,
    0x01, 0xA1, 0x01, 0x81, 0x01, 0x21, 0x05, 0xA1, 0x83, 0x01,
    0x84, 0x01, 0xA8, 0x81, 0x02, 0x21, 0x03, 0x21, 0x01, 0x82,
    0x02, 0x43, 0xA1, 0x81, 0x03, 0x22, 0x01, 0x22, 0x04, 0x43,
    0xA1, 0x81, 0x04, 0x21, 0x02, 0x21, 0x82, 0x02, 0x43, 0xA1,
    0x82, 0xC1, 0x82, 0x01, 0x82, 0x01, 0x82, 0x02, 0x43, 0xA1,
    0x01, 0x83, 0x02, 0x21, 0x02, 0xA8, 0x01, 0x81, 0x03, 0x22,
    0x02, 0xA1, 0x01, 0x81, 0x04, 0x81, 0x02, 0xA1, 0x01, 0xA9,
    0x00,
    0x87, 0x01, 0xA9, 0x81, 0x05, 0x81, 0x01, 0x81, 0x03, 0x82,
    0x02, 0xA1, 0x81, 0x01, 0x83, 0x01, 0x81, 0x01, 0x81, 0x03,
    0x21, 0x03, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x21, 0x01, 0x83,
    0x03, 0x21, 0x03, 0xA1, 0x81, 0x03, 0x22, 0x06, 0x82, 0x21,
    0x01, 0xA1, 0x81, 0x04, 0x84, 0x03, 0x82, 0x02, 0xA1, 0x81,
    0xC1, 0x8C, 0x01, 0xA2, 0x83, 0x42, 0x04, 0x85, 0x21, 0x01,
    0xA1, 0x02, 0x81, 0x42, 0x04, 0x84, 0x03, 0xA1, 0x02, 0x81,
    0x42, 0x07, 0x22, 0x02, 0xA1, 0x02, 0x81, 0x42, 0x04, 0x84,
    0x01, 0x21, 0x01, 0xA1, 0x02, 0x81, 0x42, 0x04, 0x81, 0x02,
    0x81, 0x03, 0xA1, 0x02, 0x88, 0x02, 0xA5, 0x00,
    0xA7, 0x81, 0x05, 0xAA, 0x81, 0x05, 0x81, 0x04, 0x81, 0x02,
    0xA2, 0x81, 0x01, 0x21, 0x03, 0x81, 0x03, 0x21, 0x01, 0x21,
    0x02, 0xA1, 0x81, 0x02, 0x21, 0x02, 0x81, 0x02, 0x21, 0x01,
    0x82, 0x02, 0xA1, 0x81, 0x01, 0x22, 0x02, 0x82, 0x21, 0x01,
    0x21, 0x04, 0xA1, 0x82, 0x01, 0x81, 0x02, 0x82, 0x01, 0xA7,
    0x82, 0x01, 0x81, 0x02, 0x82, 0x04, 0x43, 0xA1, 0x81, 0x02,
    0x81, 0x21, 0x07, 0x43, 0xA1, 0x81, 0x03, 0x22, 0x06, 0x43,
    0xA1, 0x81, 0x05, 0x82, 0xC1, 0x81, 0x02, 0x43, 0xA1, 0xB0,
    0x00,
    0xAC, 0x81, 0x06, 0x81, 0x03, 0xA2, 0x81, 0x01, 0x21, 0x02,
    0x21, 0x03, 0x81, 0x02, 0xA6, 0x84, 0x02, 0x85, 0x06, 0xA1,
    0x01, 0x81, 0x42, 0x02, 0x81, 0x05, 0x84, 0x01, 0xA1, 0x01,
    0x81, 0x41, 0x84, 0x02, 0x84, 0x04, 0xA1, 0x01, 0x81, 0x44,
    0x04, 0x81, 0x02, 0x21, 0x01, 0xA4, 0x01, 0x81, 0x01, 0x43,
    0x81, 0x03, 0x81, 0x01, 0x23, 0x81, 0x02, 0xA2, 0x83, 0x41,
    0x84, 0x01, 0x82, 0x02, 0x21, 0xC1, 0x21, 0x03, 0xA1, 0x81,
    0x05, 0x85, 0x01, 0x21, 0x01, 0x81, 0x04, 0xA1, 0x81, 0x01,
    0x81, 0x41, 0x81, 0x01, 0x21, 0x06, 0x21, 0x83, 0x21, 0x01,
    0xA1, 0x81, 0x01, 0x81, 0x41, 0x88, 0x02, 0x81, 0x02, 0x21,
    0x01, 0xA1, 0x81, 0x01, 0x81, 0x42, 0x08, 0x82, 0x02, 0x21,
    0x01, 0xA1, 0x81, 0x01, 0x81, 0x01, 0x87, 0x01, 0x21, 0x01,
    0x81, 0x01, 0x81, 0x02, 0xA1, 0x81, 0x03, 0x81, 0x05, 0x81,
    0x07, 0xA2, 0x85, 0x05, 0xAA, 0x00,
    0xB0, 0x81, 0x07, 0x81, 0xC1, 0x01, 0x81, 0x03, 0xA1, 0x81,
    0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x02, 0x22, 0xA1, 0x81, 0x01, 0x81, 0x43, 0x81, 0x01, 0x81,
    0x23, 0x03, 0xA1, 0x81, 0x02, 0x43, 0x81, 0x01, 0x81, 0x01,
    0x21, 0x02, 0x22, 0xA2, 0x81, 0x01, 0x82, 0x41, 0x82, 0x01,
    0x81, 0x01, 0x82, 0x04, 0xA1, 0x81, 0x01, 0x81, 0x43, 0x05,
    0x21, 0x04, 0xA1, 0x81, 0x01, 0x82, 0x01, 0x83, 0x02, 0xA7,
    0x81, 0x04, 0x81, 0x01, 0xA4, 0xA6, 0x00,
    0x04, 0xA5, 0x01, 0x84, 0x03, 0x82, 0x01, 0xA5, 0x01, 0x81,
    0x02, 0x21, 0x04, 0x83, 0x03, 0xA1, 0x01, 0x81, 0x01, 0x21,
    0xC1, 0x21, 0x01, 0x21, 0x04, 0x21, 0x02, 0xA1, 0x01, 0x81,
    0x01, 0x81, 0x21, 0x88, 0x01, 0xA2, 0x01, 0x81, 0x01, 0x81,
    0x02, 0x21, 0x02, 0x81, 0x05, 0xA1, 0x01, 0x81, 0x01, 0x81,
    0x01, 0x21, 0x01, 0x21, 0x01, 0x81, 0x01, 0x81, 0x03, 0xA1,
    0x82, 0x01, 0x81, 0x02, 0x21, 0x81, 0x01, 0x81, 0x01, 0xA5,
    0x81, 0x02, 0x82, 0x04, 0x81, 0x05, 0xA1, 0x81, 0x04, 0x21,
    0x01, 0x81, 0x01, 0x83, 0x03, 0xA1, 0x85, 0x01, 0x82, 0x02,
    0x81, 0x44, 0xA1, 0x81, 0x04, 0x21, 0x05, 0x44, 0xA1, 0x81,
    0x09, 0x81, 0x44, 0xA1, 0xB0, 0x00,
    0xAD, 0x81, 0x48, 0xA4, 0x81, 0x43, 0x84, 0x01, 0x81, 0x02,
    0xA5, 0x81, 0x43, 0x81, 0x02, 0x83, 0x04, 0x21, 0x01, 0xA1,
    0x81, 0x43, 0x22, 0x05, 0x21, 0x01, 0x21, 0x02, 0xA1, 0x81,
    0x02, 0x41, 0x81, 0x02, 0x21, 0x01, 0x21, 0x81, 0x01, 0x21,
    0x02, 0xA2, 0x81, 0x43, 0x81, 0x01, 0x81, 0x21, 0x81, 0x03,
    0x21, 0x02, 0xA1, 0x81, 0x41, 0x81, 0x01, 0x81, 0x01, 0x21,
    0x03, 0x21, 0x04, 0xA1, 0x81, 0x41, 0x02, 0x81, 0x21, 0x83,
    0x21, 0x84, 0x21, 0xA1, 0x82, 0x02, 0x81, 0x03, 0x21, 0x01,
    0x21, 0x04, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x02, 0x21, 0xC1,
    0x21, 0x02, 0x81, 0x02, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x01,
    0x84, 0x01, 0x21, 0x02, 0x21, 0xA1, 0x01, 0x81, 0x02, 0x81,
    0x04, 0x83, 0x03, 0xA1, 0x01, 0x81, 0x02, 0x81, 0x01, 0x22,
    0x01, 0x81, 0x01, 0xA5, 0x01, 0x81, 0x02, 0x81, 0x04, 0xA1,
    0x01, 0xA9, 0x00,
    0x01, 0xB2, 0x01, 0x81, 0x03, 0x21, 0x07, 0x43, 0x81, 0x41,
    0xA2, 0x01, 0x81, 0x07, 0x84, 0x45, 0x01, 0xA1, 0x01, 0x81,
    0x01, 0x87, 0x02, 0x81, 0x45, 0x01, 0xA1, 0x01, 0x81, 0x01,
    0x81, 0x04, 0x21, 0x01, 0x21, 0x01, 0x82, 0x44, 0xA2, 0x01,
    0x81, 0x01, 0x81, 0x02, 0x21, 0x01, 0x81, 0x01, 0x81, 0x01,
    0x83, 0x43, 0xA1, 0x01, 0x81, 0x01, 0x81, 0x01, 0x21, 0xC1,
    0x21, 0x01, 0x21, 0x02, 0x85, 0x01, 0xA1, 0x82, 0x01, 0x81,
    0x02, 0x21, 0x02, 0x21, 0x01, 0x22, 0x03, 0x21, 0x01, 0xA1,
    0x81, 0x02, 0x81, 0x21, 0x81, 0x01, 0x21, 0x81, 0x03, 0x81,
    0x01, 0x21, 0x82, 0x01, 0xA1, 0x81, 0x01, 0x82, 0x04, 0x82,
    0x01, 0x82, 0x01, 0x21, 0x01, 0x81, 0x01, 0xA1, 0x81, 0x01,
    0x81, 0x01, 0x21, 0x81, 0x01, 0x21, 0x01, 0x21, 0x02, 0x81,
    0x05, 0xA1, 0x81, 0x01, 0x81, 0x09, 0xA7, 0x81, 0x01, 0x88,
    0x21, 0x82, 0x03, 0xA1, 0x81, 0x08, 0x81, 0x02, 0x21, 0x03,
    0xA1, 0x88, 0x04, 0xA5, 0x07, 0x83, 0x02, 0xA1, 0x09, 0xA4,
    0x00,
    0xB4, 0x81, 0x42, 0x81, 0x04, 0x81, 0x0A, 0xA1, 0x81, 0x41,
    0x21, 0x02, 0x21, 0x02, 0x81, 0x22, 0x02, 0x21, 0x82, 0x01,
    0x21, 0xA2, 0x81, 0x41, 0x21, 0x81, 0x02, 0x83, 0x02, 0x82,
    0x01, 0x82, 0x03, 0xA1, 0x81, 0x02, 0x81, 0x01, 0x21, 0x01,
    0x81, 0x02, 0x22, 0x03, 0x21, 0x03, 0xA1, 0x81, 0x01, 0x83,
    0x02, 0x81, 0x01, 0x81, 0x02, 0x81, 0x21, 0x02, 0xA4, 0x81,
    0x02, 0x82, 0x01, 0x81, 0x01, 0x21, 0x03, 0x81, 0xC1, 0x01,
    0x81, 0x03, 0xA1, 0x81, 0x01, 0x21, 0x04, 0x21, 0x02, 0x82,
    0x41, 0x82, 0x02, 0x21, 0x01, 0xA1, 0x81, 0x02, 0x81, 0x01,
    0x21, 0x81, 0x01, 0x21, 0x81, 0x01, 0x21, 0x05, 0xA3, 0x81,
    0x02, 0x81, 0x02, 0x81, 0x02, 0x81, 0x03, 0x83, 0x03, 0xA1,
    0x81, 0x02, 0x88, 0x01, 0x81, 0x06, 0xA1, 0x81, 0x0B, 0x81,
    0x02, 0x81, 0x41, 0x81, 0x41, 0xA1, 0x82, 0x21, 0x88, 0x21,
    0x81, 0x03, 0x43, 0xA1, 0x81, 0x04, 0x41, 0x61, 0x02, 0x81,
    0x04, 0x82, 0x41, 0x81, 0x41, 0xA1, 0x81, 0x01, 0x41, 0x61,
    0x43, 0x61, 0x03, 0x21, 0x02, 0x45, 0xA1, 0xB4, 0x00,
    0x00
};

//
// ------------------------------------------------------------------ Functions
//

INT
SokoMain (
    INT ArgumentCount,
    CHAR **Arguments
    )

/*++

Routine Description:

    This routine is the main entry point for the soko application.

Arguments:

    ArgumentCount - Supplies the number of command line arguments the program
        was invoked with.

    Arguments - Supplies a tokenized array of command line arguments.

Return Value:

    Returns an integer exit code. 0 for success, nonzero otherwise.

--*/

{

    INT Character;
    SOKO_CONTEXT Context;
    int Duration;
    CHAR DurationString[32];
    INT Result;

    memset(&Context, 0, sizeof(Context));
    SwSetRawInputMode(NULL, NULL);
    SwEnableCursor(stdout, FALSE);
    if ((getenv("ENCODE_MAP") != NULL) && (ArgumentCount == 2)) {
        Result = SokoEncodeMaps(&Context, Arguments[1]);
        goto MainEnd;
    }

    SokoSetupLevel(&Context);
    while (TRUE) {
        Character = SokoGetInput(&Context);
        if (Character == SOKO_QUIT) {
            Result = 0;
            goto MainEnd;
        }

        //
        // Make a move!
        //

        if ((Character == SOKO_UP) || (Character == SOKO_DOWN) ||
            (Character == SOKO_LEFT) || (Character == SOKO_RIGHT)) {

            SokoMove(&Context, Character);

        //
        // Move to the next level.
        //

        } else if (Character == SOKO_LEVEL_UP) {
            if (Context.Level < SOKO_LEVEL_COUNT - 1) {
                Context.Level += 1;

            } else {
                Context.Level = 0;
            }

            SokoSetupLevel(&Context);

        //
        // Move to the previous level.
        //

        } else if (Character == SOKO_LEVEL_DOWN) {
            if (Context.Level > 0) {
                Context.Level -= 1;

            } else {
                Context.Level = SOKO_LEVEL_COUNT - 1;
            }

            SokoSetupLevel(&Context);

        } else if (Character == SOKO_UNDO) {
            SokoUndo(&Context);

        //
        // Restart the level.
        //

        } else if (Character == SOKO_RESTART) {
            SokoSetupLevel(&Context);
        }

        //
        // Check to see if the level was just beaten.
        //

        if (Context.RemainingBoxes == 0) {
            Duration = (int)(time(NULL) - Context.StartTime);
            if (Duration > 3600) {
                snprintf(DurationString,
                         sizeof(DurationString),
                         "%02d:%02d:%02d",
                         Duration / 3600,
                         (Duration % 3600) / 60,
                         Duration % 60);

            } else {
                snprintf(DurationString,
                         sizeof(DurationString),
                         "%02d:%02d",
                         Duration / 60,
                         Duration % 60);
            }

            SwMoveCursor(stdout, 0, SOKO_MAX_HEIGHT + SOKO_MAP_Y_OFFSET + 1);
            SwPrintInColor(ConsoleColorBlack,
                           ConsoleColorGray,
                           "You finished this level in %d moves!\n"
                           "Your time was %s\nPress SPACE to continue\n",
                           Context.Moves,
                           DurationString);

            while (TRUE) {
                Character = SwReadInputCharacter();
                if (Character == SOKO_QUIT) {
                    Result = 0;
                    goto MainEnd;
                }

                if (Character == SOKO_CONTINUE) {
                    break;
                }
            }

            //
            // Move on to the next level.
            //

            if (Context.Level < SOKO_LEVEL_COUNT - 1) {
                Context.Level += 1;
                SokoSetupLevel(&Context);

            } else {
                SwClearRegion(ConsoleColorDefault,
                              ConsoleColorDefault,
                              0,
                              0,
                              80,
                              25);

                SwMoveCursor(stdout, 0, 0);
                SwPrintInColor(ConsoleColorBlack,
                               ConsoleColorGray,
                               "You've finished the game! Go outside!\n");

                Result = 2;
                goto MainEnd;
            }
        }
    }

    Result = 0;

MainEnd:
    if (Result != 2) {
        SwClearRegion(ConsoleColorDefault, ConsoleColorDefault, 0, 0, 80, 25);
        SwMoveCursor(stdout, 0, 0);
    }

    SwEnableCursor(stdout, TRUE);
    SwRestoreInputMode();
    return Result;
}

//
// --------------------------------------------------------- Internal Functions
//

INT
SokoGetInput (
    PSOKO_CONTEXT Context
    )

/*++

Routine Description:

    This routine gets an input character.

Arguments:

    Context - Supplies a pointer to the application context.

Return Value:

    returns a SOKO_* character key.

    SOKO_QUIT on error or control-C.

--*/

{

    INT Character;

    while (TRUE) {
        Character = SwReadInputCharacter();
        if (isalpha(Character)) {
            Character = tolower(Character);
        }

        if ((Character == SOKO_UP) || (Character == SOKO_DOWN) ||
            (Character == SOKO_LEFT) || (Character == SOKO_RIGHT) ||
            (Character == SOKO_UNDO) || (Character == SOKO_RESTART) ||
            (Character == SOKO_CONTINUE) || (Character == SOKO_LEVEL_UP) ||
            (Character == SOKO_LEVEL_DOWN)) {

            return Character;
        }

        //
        // Make a lame effort to catch arrow keys too.
        //

        if (Character == 0x1B) {
            Character = SwReadInputCharacter();
            if (Character == '[') {
                Character = SwReadInputCharacter();
                if (Character == 'O') {
                    Character = SwReadInputCharacter();
                }

                if (Character == 'A') {
                    return SOKO_UP;

                } else if (Character == 'B') {
                    return SOKO_DOWN;

                } else if (Character == 'C') {
                    return SOKO_RIGHT;

                } else if (Character == 'D') {
                    return SOKO_LEFT;
                }
            }
        }

        if ((Character == 0x3) || (Character == EOF) ||
            (Character == SOKO_QUIT)) {

            break;
        }
    }

    return SOKO_QUIT;
}

VOID
SokoMove (
    PSOKO_CONTEXT Context,
    INT Move
    )

/*++

Routine Description:

    This routine attempts to move the hero.

Arguments:

    Context - Supplies a pointer to the application context.

    Move - Supplies the hero's move. Up, down, left, and right are 'a', 'd',
        's', and 'f'.

Return Value:

    0 on success.

    Returns non-zero on failure.

--*/

{

    INT DirectionX;
    INT DirectionY;
    PUCHAR Next;
    PUCHAR Next2;
    INT PlayerX;
    INT PlayerY;
    INT Type;

    DirectionX = 0;
    DirectionY = 0;
    PlayerX = Context->PlayerX;
    PlayerY = Context->PlayerY;
    switch (Move) {
    case SOKO_LEFT:
        DirectionX = -1;
        break;

    case SOKO_RIGHT:
        DirectionX = 1;
        break;

    case SOKO_UP:
        DirectionY = -1;
        break;

    case SOKO_DOWN:
        DirectionY = 1;
        break;

    default:

        assert(FALSE);

        return;
    }

    Next = &(Context->Map[PlayerY + DirectionY][PlayerX + DirectionX]);
    Next2 =
        &(Context->Map[PlayerY + (DirectionY * 2)][PlayerX + (DirectionX * 2)]);

    //
    // Here are the entire mechanics of the game. First rule: if the player is
    // next to a wall, she cannot move.
    //

    if (*Next == SOKO_MAP_WALL) {
        return;

    //
    // See if the player is trying to move a box. If what's after the box is
    // anything other than a space or a home, the move is not allowed.
    //

    } else if ((*Next == SOKO_MAP_BOX) || (*Next == SOKO_MAP_BOX_HOME)) {
        if ((*Next2 != SOKO_MAP_SPACE) && (*Next2 != SOKO_MAP_HOME)) {
            return;
        }

        //
        // This is an allowed move of a box. Perform the box move.
        //

        if (*Next2 == SOKO_MAP_HOME) {
            *Next2 = SOKO_MAP_BOX_HOME;
            Context->RemainingBoxes -= 1;

        } else {
            *Next2 = SOKO_MAP_BOX;
        }

        if (*Next == SOKO_MAP_BOX_HOME) {
            Context->RemainingBoxes += 1;
            *Next = SOKO_MAP_HOME;

        } else {
            *Next = SOKO_MAP_SPACE;
        }
    }

    //
    // Redraw the 2 or 3 squares that have changed, starting with the player's
    // old position.
    //

    Type = Context->Map[PlayerY][PlayerX];
    SwMoveCursor(stdout, PlayerX, PlayerY + SOKO_MAP_Y_OFFSET);
    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    Type = SOKO_MAP_PLAYER;
    SwMoveCursor(stdout,
                 PlayerX + DirectionX,
                 PlayerY + DirectionY + SOKO_MAP_Y_OFFSET);

    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    Type = *Next2;
    SwMoveCursor(stdout,
                 PlayerX + (DirectionX * 2),
                 PlayerY + (DirectionY * 2) + SOKO_MAP_Y_OFFSET);

    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    //
    // Actually move the player.
    //

    Context->PlayerX += DirectionX;
    Context->PlayerY += DirectionY;
    Context->LastMove = Move;
    Context->Moves += 1;

    //
    // Move the cursor back over the player for OCD reasons.
    //

    SwMoveCursor(stdout,
                 Context->PlayerX,
                 Context->PlayerY + SOKO_MAP_Y_OFFSET);

    return;
}

VOID
SokoUndo (
    PSOKO_CONTEXT Context
    )

/*++

Routine Description:

    This routine undoes the last move.

Arguments:

    Context - Supplies a pointer to the application context.

Return Value:

    0 on success.

    Returns non-zero on failure.

--*/

{

    PUCHAR Current;
    INT DirectionX;
    INT DirectionY;
    INT PlayerX;
    INT PlayerY;
    PUCHAR Previous;
    INT Type;

    DirectionX = 0;
    DirectionY = 0;
    PlayerX = Context->PlayerX;
    PlayerY = Context->PlayerY;
    switch (Context->LastMove) {
    case SOKO_LEFT:
        DirectionX = -1;
        break;

    case SOKO_RIGHT:
        DirectionX = 1;
        break;

    case SOKO_UP:
        DirectionY = -1;
        break;

    case SOKO_DOWN:
        DirectionY = 1;
        break;

    default:
        return;
    }

    Context->LastMove = 0;

    //
    // Look one in the direction the player had moved to see if a block needs
    // to be pulled back.
    //

    Previous = &(Context->Map[PlayerY + DirectionY][PlayerX + DirectionX]);
    if ((*Previous == SOKO_MAP_BOX) || (*Previous == SOKO_MAP_BOX_HOME)) {
        Current = &(Context->Map[PlayerY][PlayerX]);
        if (*Previous == SOKO_MAP_BOX_HOME) {
            *Previous = SOKO_MAP_HOME;
            Context->RemainingBoxes += 1;

        } else {
            *Previous = SOKO_MAP_SPACE;
        }

        if (*Current == SOKO_MAP_HOME) {
            *Current = SOKO_MAP_BOX_HOME;
            Context->RemainingBoxes -= 1;

        } else {

            assert(*Current == SOKO_MAP_SPACE);

            *Current = SOKO_MAP_BOX;
        }
    }

    //
    // Redraw the 2 or 3 squares that have changed, starting with the now empty
    // square the box may have been pulled from.
    //

    Type = Context->Map[PlayerY + DirectionY][PlayerX + DirectionX];
    SwMoveCursor(stdout,
                 PlayerX + DirectionX,
                 PlayerY + DirectionY + SOKO_MAP_Y_OFFSET);

    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    Type = Context->Map[PlayerY][PlayerX];
    SwMoveCursor(stdout, PlayerX, PlayerY + SOKO_MAP_Y_OFFSET);
    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    Type = SOKO_MAP_PLAYER;
    SwMoveCursor(stdout,
                 PlayerX - DirectionX,
                 PlayerY - DirectionY + SOKO_MAP_Y_OFFSET);

    SwPrintInColor(SokoMapBackgroundColors[Type],
                   SokoMapForegroundColors[Type],
                   "%c",
                   SokoMapTiles[Type]);

    //
    // Move the player in the opposite direction they had gone.
    //

    Context->PlayerX -= DirectionX;
    Context->PlayerY -= DirectionY;
    Context->Moves -= 1;

    //
    // Move the cursor back over the player for OCD reasons.
    //

    SwMoveCursor(stdout,
                 Context->PlayerX,
                 Context->PlayerY + SOKO_MAP_Y_OFFSET);

    return;
}

INT
SokoEncodeMaps (
    PSOKO_CONTEXT Context,
    PSTR MapsPath
    )

/*++

Routine Description:

    This routine reads the level maps in from a file, and writes them out as
    C source in a run-length-encoded format.

Arguments:

    Context - Supplies a pointer to the application context.

    MapsPath - Supplies a pointer to a string containing the path of the level
        maps file.

Return Value:

    0 on success.

    Returns non-zero on failure.

--*/

{

    INT Count;
    PSTR Current;
    INT EncodeCount;
    FILE *File;
    INT LevelCount;
    INT LevelHeight;
    CHAR Line[SOKO_MAX_WIDTH + 1];
    INT MaxLevelHeight;
    INT OutColumn;
    PSTR Start;
    INT Status;
    UCHAR Value;

    EncodeCount = 0;
    LevelCount = 0;
    File = fopen(MapsPath, "r");
    if (File == NULL) {
        Status = errno;
        SwPrintError(Status, MapsPath, "Could not open");
        goto EncodeMapsEnd;
    }

    MaxLevelHeight = 0;
    LevelHeight = 0;
    printf("const UCHAR SokoMaps[] = {\n    ");
    OutColumn = 0;
    while (TRUE) {
        if (fgets(Line, sizeof(Line), File) == NULL) {
            Status = 0;
            break;
        }

        Line[sizeof(Line) - 1] = '\0';

        //
        // If the line begins with a semicolon, it's a comment, so ignore it.
        //

        if (Line[0] == ';') {
            continue;
        }

        //
        // Read the line into runs of consecutive characters.
        //

        Count = 0;
        Start = Line;
        Current = Start;
        Value = SOKO_MAP_LEVEL;
        while ((*Current != '\r') && (*Current != '\n') && (*Current != '\0')) {

            //
            // Get the run size.
            //

            while (*Current == *Start) {
                Current += 1;
            }

            //
            // Spit out the run.
            //

            Count = Current - Start;
            Value = Count;
            switch (*Start) {
            case ' ':
                Value |= SOKO_MAP_SPACE << SOKO_MAP_TYPE_SHIFT;
                break;

            case '$':
                Value |= SOKO_MAP_BOX << SOKO_MAP_TYPE_SHIFT;
                break;

            case '.':
                Value |= SOKO_MAP_HOME << SOKO_MAP_TYPE_SHIFT;
                break;

            case '*':
                Value |= SOKO_MAP_BOX_HOME << SOKO_MAP_TYPE_SHIFT;
                break;

            case '#':
                if ((*Current == '\r') || (*Current == '\n')) {
                    Value |= SOKO_MAP_WALL_NEWLINE << SOKO_MAP_TYPE_SHIFT;

                } else {
                    Value |= SOKO_MAP_WALL << SOKO_MAP_TYPE_SHIFT;
                }

                break;

            case '@':

                assert(Count == 1);
                assert((*Current != '\r') &&
                       (*Current != '\n') &&
                       (*Current != '\0'));

                Value |= SOKO_MAP_PLAYER << SOKO_MAP_TYPE_SHIFT;
                break;

            default:
                SwPrintError(0, Line, "Unknown character in line");
                Status = EINVAL;
                goto EncodeMapsEnd;
            }

            printf("0x%02X, ", Value);
            EncodeCount += 1;
            OutColumn += 1;
            if (OutColumn >= 10) {
                printf("\n    ");
                OutColumn = 0;
            }

            Start = Current;
        }

        //
        // If the line was empty, print a level separator, but only one.
        //

        if (Current == Line) {
            if (LevelHeight != 0) {
                printf("0x00,\n    ");
                OutColumn = 0;
                LevelCount += 1;
                if (MaxLevelHeight < LevelHeight) {
                    MaxLevelHeight = LevelHeight;
                }

                LevelHeight = 0;
            }

        } else {
            LevelHeight += 1;
        }
    }

    //
    // Print a second level terminator to indicate the complete end of the
    // maps.
    //

    printf("0x00\n};\n\n");
    printf("#define SOKO_ENCODED_MAP_SIZE %d\n", EncodeCount);
    printf("#define SOKO_LEVEL_COUNT %d\n"
           "#define SOKO_MAX_HEIGHT %d\n\n",
           LevelCount,
           MaxLevelHeight);

EncodeMapsEnd:
    if (File != NULL) {
        fclose(File);
    }

    return Status;
}

VOID
SokoSetupLevel (
    PSOKO_CONTEXT Context
    )

/*++

Routine Description:

    This routine sets up and displays the level described in the context.

Arguments:

    Context - Supplies a pointer to the application context.

Return Value:

    0 on success.

    Returns non-zero on failure.

--*/

{

    INT Count;
    INT CurrentX;
    INT CurrentY;
    INT Index;
    PCSTR *Legend;
    CHAR Line[SOKO_MAX_WIDTH + 2];
    PUCHAR Map;
    CHAR MapType;
    CHAR Tile;
    CHAR Type;

    SwClearRegion(ConsoleColorBlack, ConsoleColorDefault, 0, 0, 80, 25);
    SwMoveCursor(stdout, 0, 0);
    SwPrintInColor(ConsoleColorBlack,
                   ConsoleColorGray,
                   "Level %d\n",
                   Context->Level + 1);

    SwMoveCursor(stdout, 0, SOKO_MAP_Y_OFFSET);
    Map = SokoFindLevelMap(Context);
    if (Map == NULL) {
        return;
    }

    Context->RemainingBoxes = 0;
    Context->Moves = 0;
    Context->LastMove = 0;
    CurrentX = 0;
    CurrentY = 0;
    while (*Map != SOKO_MAP_LEVEL) {
        Count = *Map & SOKO_MAP_COUNT_MASK;
        Type = *Map >> SOKO_MAP_TYPE_SHIFT;
        MapType = Type;
        if (Type == SOKO_MAP_PLAYER) {
            MapType = SOKO_MAP_SPACE;

            assert(Count == 1);

            Context->PlayerX = CurrentX;
            Context->PlayerY = CurrentY;

        } else if (Type == SOKO_MAP_WALL_NEWLINE) {
            MapType = SOKO_MAP_WALL;
        }

        Tile = SokoMapTiles[(int)Type];
        for (Index = 0; Index < Count; Index += 1) {
            Line[Index] = Tile;
            Context->Map[CurrentY][CurrentX] = MapType;
            CurrentX += 1;
        }

        assert(CurrentX < SOKO_MAX_WIDTH);

        if (Type == SOKO_MAP_WALL_NEWLINE) {
            Line[Index] = '\n';
            Index += 1;
            CurrentX = 0;
            CurrentY += 1;

            assert(CurrentY < SOKO_MAX_HEIGHT);
        }

        if (Type == SOKO_MAP_BOX) {
            Context->RemainingBoxes += Count;
        }

        Line[Index] = '\0';
        SwPrintInColor(SokoMapBackgroundColors[(int)Type],
                       SokoMapForegroundColors[(int)Type],
                       "%s",
                       Line);

        Map += 1;
    }

    SwMoveCursor(stdout, 0, SOKO_MAX_HEIGHT + SOKO_MAP_Y_OFFSET + 4);
    Legend = SokoLegend;
    while (*Legend != NULL) {
        SwPrintInColor(ConsoleColorGray,
                       ConsoleColorBlack,
                       "%c ",
                       (*Legend)[0]);

        SwPrintInColor(ConsoleColorBlack,
                       ConsoleColorGray,
                       " %-11s",
                       (*Legend) + 1);

        Legend += 1;
    }

    SwMoveCursor(stdout, Context->PlayerX, Context->PlayerY + 1);
    Context->StartTime = time(NULL);
    return;
}

PUCHAR
SokoFindLevelMap (
    PSOKO_CONTEXT Context
    )

/*++

Routine Description:

    This routine returns a pointer to the level data for the current level.

Arguments:

    Context - Supplies a pointer to the application context.

Return Value:

    Returns a pointer to the level data.

--*/

{

    PUCHAR Data;
    INT Level;

    assert(Context->Level < SOKO_LEVEL_COUNT);

    Level = Context->Level;
    Data = (PUCHAR)SokoMaps;
    while (Level != 0) {
        while (*Data != SOKO_MAP_LEVEL) {
            Data += 1;
        }

        Data += 1;
        Level -= 1;
        if (*Data == SOKO_MAP_LEVEL) {
            return NULL;
        }
    }

    return Data;
}

